Définir la précision des nombres à virgule flottante en C++
-
Utilisez
std::setprecision
pour définir la précision des nombres à virgule flottante en C++ -
Utilisez
std::floor
etstd::ceil
pour modifier la précision des nombres à virgule flottante -
Utilisez
std::round
etstd::lround
pour modifier la précision des nombres à virgule flottante
Cet article explique plusieurs méthodes de définition de la précision des nombres à virgule flottante en C++.
Utilisez std::setprecision
pour définir la précision des nombres à virgule flottante en C++
std::setprecision
fait partie de la bibliothèque de manipulateurs d’E/S STL qui peut être utilisée pour formater les flux d’entrée/sortie. setprecision
change la précision des nombres à virgule flottante, et il ne prend qu’un paramètre entier spécifiant les chiffres des nombres à afficher après la virgule décimale. À savoir, la précision par défaut supposée implicitement pour les nombres à virgule flottante est de six chiffres après la virgule. Pourtant, parfois, le flotteur peut être affiché par la notation scientifique lorsque le nombre est trop petit et qu’aucun manipulateur n’est utilisé. Notez que ces nombres peuvent perdre tous les chiffres significatifs et apparaître sous forme de zéros, comme illustré dans l’exemple de code suivant.
#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;
}
Production:
123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
123.231 | 2.234 | 0.012 | 26.949 | 113.000 | 0.000 |
Utilisez std::floor
et std::ceil
pour modifier la précision des nombres à virgule flottante
Les fonctions std::floor
et std::ceil
sont fournies par l’en-tête <cmath>
, qui était à l’origine implémenté dans la bibliothèque standard C. La fonction ceil
calcule la plus petite valeur entière supérieure ou égale à la virgule flottante passée comme seul argument. D’un autre côté, floor
calcule la plus grande valeur entière inférieure ou égale à l’argument. Ces fonctions sont définies pour les types float
, double
et long double
.
#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;
}
Production:
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 |
Utilisez std::round
et std::lround
pour modifier la précision des nombres à virgule flottante
Alternativement, std::round
et std::round
peuvent être utilisés pour calculer les valeurs entières les plus proches arrondies à partir de zéro. Ces fonctions sont susceptibles de générer des erreurs d’arithmétique en virgule flottante, qui sont discutées en détail sur la page.
#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;
}
Production:
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