Einstellen der Präzision von Fließkommazahlen in C++
-
Verwenden von
std::setprecision
zum Einstellen der Präzision von Fließkommazahlen in C++ -
Verwenden von
std::floor
undstd::ceil
zum Ändern der Genauigkeit von Fließkommazahlen -
Verwenden von
std::round
undstd::lround
zum die Genauigkeit von Gleitkommazahlen zu ändern
In diesem Artikel werden verschiedene Methoden zum Festlegen der Genauigkeit von Gleitkommazahlen in C++ erläutert.
Verwenden von std::setprecision
zum Einstellen der Präzision von Fließkommazahlen in C++
std::setprecision
ist Teil der STL I/O-Manipulatorbibliothek, mit der die Eingabe-/Ausgabestreams formatiert werden können. setprecision
ändert die Genauigkeit der Gleitkommazahlen und es wird nur ein integraler Parameter benötigt, der die nach dem Dezimalpunkt anzuzeigenden Ziffern angibt. Die implizit für die Gleitkommazahlen implizit angenommene Standardgenauigkeit beträgt sechs Ziffern nach dem Komma. Dennoch kann es vorkommen, dass der Float manchmal in der wissenschaftlichen Notation angezeigt wird, wenn die Anzahl zu klein ist und keine Manipulatoren verwendet werden. Beachten Sie, dass solche Zahlen möglicherweise alle signifikanten Ziffern verlieren und als Nullen angezeigt werden, wie im folgenden Beispielcode gezeigt.
#include <iomanip>
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::fixed;
using std::setprecision;
using std::vector;
int main() {
vector<double> d_vec = {123.231, 2.2343, 0.012,
26.9491092019, 113, 0.000000234};
for (auto &i : d_vec) {
cout << i << " | ";
}
cout << endl;
for (auto &i : d_vec) {
cout << setprecision(3) << i << " | ";
}
cout << endl;
return EXIT_SUCCESS;
}
Ausgabe:
123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
123.231 | 2.234 | 0.012 | 26.949 | 113.000 | 0.000 |
Verwenden von std::floor
und std::ceil
zum Ändern der Genauigkeit von Fließkommazahlen
Die Funktionen std::floor
und std::ceil
werden vom Header <cmath>
bereitgestellt, der ursprünglich in der C-Standardbibliothek implementiert war. Die Funktion ceil
berechnet den kleinsten ganzzahligen Wert, der größer oder gleich dem als einziges Argument übergebenen Gleitkommawert ist. Andererseits berechnet floor
den größten ganzzahligen Wert, der kleiner oder gleich dem Argument ist. Diese Funktionen sind für die Typen float
, double
und long double
definiert.
#include <cmath>
#include <iomanip>
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::fixed;
using std::vector;
int main() {
vector<double> d_vec = {123.231, 2.2343, 0.012,
26.9491092019, 113, 0.000000234};
for (auto &i : d_vec) {
cout << i << " | ";
}
cout << endl;
for (auto &i : d_vec) {
cout << fixed << std::ceil(i) << " | ";
}
cout << endl;
for (auto &i : d_vec) {
cout << fixed << std::floor(i) << " | ";
}
cout << endl;
return EXIT_SUCCESS;
}
Ausgabe:
123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
124.000000 | 3.000000 | 1.000000 | 27.000000 | 113.000000 | 1.000000 |
123.000000 | 2.000000 | 0.000000 | 26.000000 | 113.000000 | 0.000000 |
Verwenden von std::round
und std::lround
zum die Genauigkeit von Gleitkommazahlen zu ändern
Alternativ können std::round
und std::round
verwendet werden, um die nächsten ganzzahligen Werte zu berechnen, die von Null abgerundet werden. Diese Funktionen verursachen wahrscheinlich Gleitkomma-Arithmetikfehler, die auf der Seite ausführlich erläutert werden.
#include <cmath>
#include <iomanip>
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::fixed;
using std::vector;
int main() {
vector<double> d_vec = {123.231, 2.2343, 0.012,
26.9491092019, 113, 0.000000234};
for (auto &i : d_vec) {
cout << i << " | ";
}
cout << endl;
for (auto &i : d_vec) {
cout << fixed << std::round(i) << " | ";
}
cout << endl;
for (auto &i : d_vec) {
cout << fixed << std::lround(i) << " | ";
}
cout << endl;
return EXIT_SUCCESS;
}
Ausgabe:
123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
123.000000 | 2.000000 | 0.000000 | 27.000000 | 113.000000 | 0.000000 |
123 | 2 | 0 | 27 | 113 | 0 |
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook