Establecer la precisión de los números de punto flotante en C++
-
Utilice
std::setprecision
para establecer la precisión de los números de coma flotante en C++ -
Utilice
std::floor
ystd::ceil
para modificar la precisión de los números de coma flotante -
Utilice
std::round
ystd::lround
para modificar la precisión de los números de coma flotante
Este artículo explicará varios métodos de cómo establecer la precisión de los números de punto flotante en C++.
Utilice std::setprecision
para establecer la precisión de los números de coma flotante en C++
std::setprecision
es parte de la biblioteca de manipuladores de E/S de STL que se puede usar para formatear los flujos de entrada/salida. setprecision
cambia la precisión de los números de punto flotante, y solo se necesita un parámetro integral que especifique los dígitos del número que se mostrarán después del punto decimal. Es decir, la precisión predeterminada asumida implícitamente para los números de punto flotante es de seis dígitos después de la coma. Aún así, a veces el float puede mostrarse mediante la notación científica cuando el número es demasiado pequeño y no se utilizan manipuladores. Tenga en cuenta que dichos números pueden perder todos los dígitos significativos y aparecer como ceros, como se muestra en el siguiente código de ejemplo.
#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;
}
Producción :
123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
123.231 | 2.234 | 0.012 | 26.949 | 113.000 | 0.000 |
Utilice std::floor
y std::ceil
para modificar la precisión de los números de coma flotante
Las funciones std::floor
y std::ceil
son proporcionadas por el encabezado <cmath>
, que se implementó originalmente en la biblioteca estándar de C. La función ceil
calcula el valor entero más pequeño mayor o igual que el punto flotante pasado como único argumento. Por otro lado, floor
calcula el valor entero más grande menor o igual que el argumento. Estas funciones están definidas para los tipos float
, double
y 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;
}
Producción :
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 |
Utilice std::round
y std::lround
para modificar la precisión de los números de coma flotante
Alternativamente, std::round
y std::round
se pueden utilizar para calcular los valores enteros más cercanos que se redondean desde cero. Es probable que estas funciones arrojen errores relacionados con la aritmética de punto flotante, que se describen en detalle en la página.
#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;
}
Producción :
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