Définir la précision des nombres à virgule flottante en C++

Jinku Hu 12 octobre 2023
  1. Utilisez std::setprecision pour définir la précision des nombres à virgule flottante en C++
  2. Utilisez std::floor et std::ceil pour modifier la précision des nombres à virgule flottante
  3. Utilisez std::round et std::lround pour modifier la précision des nombres à virgule flottante
Définir la précision des nombres à virgule flottante en C++

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 |
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Article connexe - C++ Float