Establecer la precisión de los números de punto flotante en C++

Jinku Hu 12 octubre 2023
  1. Utilice std::setprecision para establecer la precisión de los números de coma flotante en C++
  2. Utilice std::floor y std::ceil para modificar la precisión de los números de coma flotante
  3. Utilice std::round y std::lround para modificar la precisión de los números de coma flotante
Establecer la precisión de los números de punto flotante en C++

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

Artículo relacionado - C++ Float