Définir la précision des nombres à virgule flottante en C++
-
Utilisez
std::setprecisionpour définir la précision des nombres à virgule flottante en C++ -
Utilisez
std::flooretstd::ceilpour modifier la précision des nombres à virgule flottante -
Utilisez
std::roundetstd::lroundpour 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