Definir a precisão dos números de ponto flutuante em C++
-
Use
std::setprecision
para definir a precisão dos números de ponto flutuante em C++ -
Use
std::floor
estd::ceil
para modificar a precisão dos números de ponto flutuante -
Use
std::round
estd::lround
para modificar a precisão dos números de ponto flutuante
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 |
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