Definir a precisão dos números de ponto flutuante em C++

Jinku Hu 12 outubro 2023
  1. Use std::setprecision para definir a precisão dos números de ponto flutuante em C++
  2. Use std::floor e std::ceil para modificar a precisão dos números de ponto flutuante
  3. Use std::round e std::lround para modificar a precisão dos números de ponto flutuante
Definir a precisão dos números de ponto flutuante em C++

Este artigo explicará vários métodos de como definir a precisão de números de ponto flutuante em C++.

Use std::setprecision para definir a precisão dos números de ponto flutuante em C++

std::setprecision é parte da biblioteca de manipuladores de I/O STL que pode ser usada para formatar os fluxos de entrada/saída. setprecision altera a precisão dos números de ponto flutuante, e leva apenas um parâmetro integral especificando os dígitos do número a serem exibidos após o ponto decimal. Ou seja, a precisão padrão assumida implicitamente para os números de ponto flutuante é de seis dígitos após a vírgula. Ainda assim, às vezes o float pode ser exibido pela notação científica quando o número é muito pequeno e nenhum manipulador é usado. Observe que esses números podem perder todos os dígitos significativos e aparecer como zeros, conforme demonstrado no código de exemplo a seguir.

#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;
}

Resultado:

123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
123.231 | 2.234 | 0.012 | 26.949 | 113.000 | 0.000 |

Use std::floor e std::ceil para modificar a precisão dos números de ponto flutuante

As funções std::floor e std::ceil são fornecidas pelo cabeçalho <cmath>, que foi originalmente implementado na biblioteca C padrão. A função ceil calcula o menor valor inteiro maior ou igual ao ponto flutuante passado como o único argumento. Por outro lado, floor calcula o maior valor inteiro menor ou igual ao argumento. Essas funções são definidas para os tipos float, double e 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;
}

Resultado:

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 |

Use std::round e std::lround para modificar a precisão dos números de ponto flutuante

Alternativamente, std::round e std::round podem ser utilizados para calcular os valores inteiros mais próximos que são arredondados de zero. Essas funções provavelmente geram erros relacionados à aritmética de ponto flutuante, que são discutidos em detalhes na 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;
}

Resultado:

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

Artigo relacionado - C++ Float