Neste tutorial, aprenderemos sobre os tipos de dados float e double com a ajuda de exemplos. Também veremos algumas das principais diferenças entre eles e quando usá-los.
Em C ++, os tipos de dados float
e double
são usados para valores de ponto flutuante. Números de ponto flutuante são usados para valores decimais e exponenciais . Por exemplo,
// creating float type variables float num1 = 3.0f; float num2 = 3.5f; float num3 = 3E-5f; // 3x10^-5 // creating double type variables double num4 = 3.0; double num5 = 3.5; double num6 = 3E-5; // 3x10^-5
Devemos adicionar o sufixo f
ou F
no final de um float
valor. Isso ocorre porque o compilador interpreta os valores decimais sem o sufixo como double
.
Considere este código.
float a = 5.6;
Aqui, atribuímos um double
valor a uma float
variável.
Nesse caso, 5.6 é convertido para float
pelo compilador automaticamente antes de ser atribuído à variável a. Isso pode resultar em perda de dados. Para saber mais, visite Conversão de tipo C ++.
Diferença entre float e double
flutuador | em dobro |
---|---|
Tamanho: 4 bytes | Tamanho: 8 bytes |
Precisão: em geral, precisão de 7 dígitos decimais | Precisão: em geral, precisão de 15 dígitos decimais |
Exemplo: 3.56f , 3e5f etc. | Exemplo: 3.56 , 3e5 etc. |
Observação: a menos que você tenha um requisito específico, sempre use em double
vez de float
, pois as float
variáveis podem apresentar erros ao trabalhar com números grandes.
Exemplo 1: C ++ float e double
#include #include using namespace std; int main() ( // Creating a double type variable double a = 3.912348239293; // Creating a float type variable float b = 3.912348239293f; // Printing the two variables cout << "Double Type Number = " << a << endl; cout << "Float Type Number = " << b << endl; return 0; )
Resultado
Número do tipo duplo = 3,91235 Número do tipo flutuante = 3,91235
Nota: O compilador usado para este exemplo (compilador MinGW) permitia 6 dígitos. Assim, nossos valores de variáveis foram arredondados e truncados para 6 dígitos pelo compilador.
setprecision () para especificar pontos decimais
Podemos especificar o número de casas decimais a serem impressas cout
usando a setprecision()
função.
Esta função é definida no iomanip
arquivo de cabeçalho, que significa manipulação de entrada / saída .
Exemplo 2: Usando setprecision () para números de ponto flutuante
#include #include using namespace std; int main() ( // Creating a double type variable double a = 3.912348239293; // Creating a float type variable float b = 3.912348239293f; // Setting the precision to 12 decimal places cout << setprecision(13); // Printing the two variables cout << "Double Type Number = " << a << endl; cout << "Float Type Number = " << b << endl; return 0; )
Resultado
Número do tipo duplo = 3,912348239293 Número do tipo flutuante = 3,912348270416
Como podemos ver no exemplo acima, especificamos a precisão de até 13 dígitos.
cout << setprecision(13);
O valor de ponto flutuante que atribuímos às nossas variáveis também consiste em 13 dígitos.
No entanto, como float
tem uma precisão de até 7 dígitos, ele mostra valores de lixo depois que sua precisão é excedida.
Nossa double
variável mostra o número correto porque tem uma precisão de 15 dígitos, enquanto o próprio número consiste em 13 dígitos.
Como alternativa, podemos especificar precisões diferentes para variáveis diferentes ao imprimi-las.
Exemplo 3: Diferentes Precisões para Diferentes Variáveis
#include #include using namespace std; int main() ( // Creating a double type variable double a = 3.912348239293; // Creating a float type variable float b = 3.912348239293f; // Setting precision to 11 for double cout << "Double Type Number = " << setprecision(11) << a << endl; // Setting precision to 7 for float cout << "Float Type Number = " << setprecision(7) << b << endl; return 0; )
Resultado
Número do tipo duplo = 3,9123482393 Número do tipo flutuante = 3,912348
No programa acima, podemos ver que definimos dois valores de precisão diferentes para float
e double
.
Em ambos os casos, a precisão é menor do que os dígitos reais do número. Portanto, o último dígito é arredondado e o resto é truncado.
Nota: Se especificarmos a precisão maior do que a precisão do próprio tipo de dados (7 para float
e 15 para double
), o compilador nos dará valores de lixo após o limite de precisão ter sido excedido, como pode ser visto com a float
saída no exemplo 2 .
Trabalhe com números exponenciais
Conforme mencionado acima, float
e double
também pode ser usado para representar números exponenciais . Por exemplo,
// ex = 325 X (10 25) double ex = 325E25;
C ++ produz números exponenciais e números muito grandes em um formato chamado formato científico . A variável ex será gerada neste formato por padrão, pois é um número muito grande.
Para forçar o C ++ a exibir nossos números de ponto flutuante no scientific
formato, independentemente do tamanho do número, usamos o especificador de formato scientific
dentro de cout
.
double num = 3.25; // ex = 325 X (10 25) double ex = 325E25; // using scientific format cout << scientific << num; cout << scientific << ex;
Além disso, há outro especificador de formato conhecido como fixed
, que exibe números de ponto flutuante no formato decimal.
É semelhante a exibir números de ponto flutuante usando apenas cout
sem setprecision()
, exceto pelo fato de que fixed
exibe números de até 6 casas decimais.
Por outro lado, utilizando apenas cout
dígitos de exibição de acordo com o compilador específico (6 dígitos no caso do compilador MinGW , incluindo os dígitos antes da vírgula decimal).
Exemplo 4: formatos fixos e científicos
#include #include using namespace std; int main() ( // Creating a decimal double type variable double a = 3.912348239293; // Creating an exponential double type variable double ex1 = 325e+2; // Creating a float type variable float b = 3.912348239293f; // Creating an exponential float type variable float ex2 = 325e+2f; // Displaying output with fixed cout << "Displaying Output With fixed:" << endl; cout << "Double Type Number 1 = " << fixed << a << endl; cout << "Double Type Number 2 = " << fixed << ex1 << endl; cout << "Float Type Number 1 = " << fixed << b << endl; cout << "Float Type Number 2 = " << fixed << ex2 << endl; // Displaying output with scientific cout << "Displaying Output With scientific:" << endl; cout << "Double Type Number 1 = " << scientific << a << endl; cout << "Double Type Number 2 = " << scientific << ex1 << endl; cout << "Float Type Number 1 = " << scientific << b << endl; cout << "Float Type Number 2 = " << scientific << ex2 << endl; return 0; )
Resultado
Displaying Output With fixed: Double Type Number 1 = 3.912348 Double Type Number 2 = 32500.000000 Float Type Number 1 = 3.912348 Float Type Number 2 = 32500.000000 Displaying Output With scientific: Double Type Number 1 = 3.912348e+000 Double Type Number 2 = 3.250000e+004 Float Type Number 1 = 3.912348e+000 Float Type Number 2 = 3.250000e+004
long double
Apart from float
and double
, there is another data type that can store floating-point numbers. This is known as long double
.
It usually occupies a space of 12 bytes (depends on the computer system in use), and its precision is at least the same as double
, though most of the time, it is greater than that of double
.
long double
values should end with L
. For example,
// declaring a long double variable long double num_ldb = 2.569L;
Nota: Os tipos de dados de ponto flutuante suportados pelo C ++ são float
, double
e long double
. Não existe long float
.