Einstellen der Präzision von Fließkommazahlen in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden von std::setprecision zum Einstellen der Präzision von Fließkommazahlen in C++
  2. Verwenden von std::floor und std::ceil zum Ändern der Genauigkeit von Fließkommazahlen
  3. Verwenden von std::round und std::lround zum die Genauigkeit von Gleitkommazahlen zu ändern
Einstellen der Präzision von Fließkommazahlen in C++

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 |
Autor: 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

Verwandter Artikel - C++ Float