Tipo float

Os números de vírgula flutuante usam o formato IEEE (Institute of Electrical and Electronics Engineers). Valores de precisão única com tipo float têm 4 bytes, consistindo em um bit de sinal, um expoente binário de 8 bits em excesso de 127 e um mantissa de 23 bits. A mantissa representa um número entre 1,0 e 2,0. Como o bit de alta ordem da mantissa é sempre 1, ele não é armazenado no número. Esta representação dá um intervalo de aproximadamente 3.4E-38 a 3.4E+38 para o tipo float.

Você pode declarar variáveis como float ou double, dependendo das necessidades do seu aplicativo. As principais diferenças entre os dois tipos são a importância que podem representar, o armazenamento que necessitam e o seu alcance. A tabela a seguir mostra a relação entre significância e requisitos de armazenamento.

Floating-Point Tipos

Tipo Algarismos significativos Número de bytes
float 6 - 7 4
duplo 15 - 16 8

As variáveis de vírgula flutuante são representadas por uma mantissa, que contém o valor do número, e um expoente, que contém a ordem de grandeza do número.

A tabela a seguir mostra o número de bits alocados para a mantissa e o expoente para cada tipo de ponto flutuante. O bit mais significativo de qualquer flutuador ou duplo é sempre o bit de sinal. Se for 1, o número é considerado negativo; caso contrário, é considerado um número positivo.

Comprimentos de Expoentes e Mantissas

Tipo Comprimento do expoente Comprimento de Mantissa
float 8 bits 23 bits
duplo 11 bits 52 bits

Como os expoentes são armazenados em um formulário não assinado, o expoente é enviesado pela metade de seu valor possível. Para o tipo float, o viés é 127; para o tipo duplo, é 1023. Você pode calcular o valor do expoente real subtraindo o valor de viés do valor do expoente.

A mantissa é armazenada como uma fração binária maior ou igual a 1 e menor que 2. Para os tipos float e double, há um 1 líder implícito na mantissa na posição de bit mais significativa, então as mantissas têm na verdade 24 e 53 bits de comprimento, respectivamente, embora o bit mais significativo nunca seja armazenado na memória.

Em vez do método de armazenamento descrito acima, o pacote de ponto flutuante pode armazenar números binários de ponto flutuante como números desnormalizados. "Números desnormalizados" são números de vírgula flutuante diferentes de zero com valores de expoentes reservados em que o bit mais significativo da mantissa é 0. Usando o formato desnormalizado, o intervalo de um número de vírgula flutuante pode ser estendido ao custo da precisão. Não é possível controlar se um número de vírgula flutuante é representado de forma normalizada ou desnormalizada; O pacote de vírgula flutuante determina a representação. O pacote de ponto flutuante nunca usa uma forma desnormalizada, a menos que o expoente se torne menor do que o mínimo que pode ser representado em uma forma normalizada.

A tabela a seguir mostra os valores mínimo e máximo que você pode armazenar em variáveis de cada tipo de vírgula flutuante. Os valores listados nesta tabela aplicam-se apenas a números de vírgula flutuante normalizados; Os números de vírgula flutuante desnormalizados têm um valor mínimo menor. Observe que os números retidos em registros 80x87 são sempre representados na forma normalizada de 80 bits; Os números só podem ser representados de forma desnormalizada quando armazenados em variáveis de ponto flutuante de 32 bits ou 64 bits (variáveis do tipo float e tipo long).

Gama de tipos de Floating-Point

Tipo Valor mínimo Valor máximo
float 1,175494351 E - 38 3,402823466 E + 38
duplo 2.2250738585072014 E - 308 1,7976931348623158 E + 308

Se a precisão for menos preocupante do que o armazenamento, considere o uso do tipo float para variáveis de ponto flutuante. Por outro lado, se a precisão for o critério mais importante, use o tipo duplo.

As variáveis de ponto flutuante podem ser promovidas para um tipo de maior significância (do tipo float para o tipo double). A promoção geralmente ocorre quando você executa aritmética em variáveis de ponto flutuante. Esta aritmética é sempre feita com um grau de precisão tão elevado como a variável com o mais elevado grau de precisão. Por exemplo, considere as seguintes declarações de tipo:

float f_short;
double f_long;
long double f_longer;

f_short = f_short * f_long;

No exemplo anterior, a variável f_short é promovida para o tipo double e multiplicada por f_long; em seguida, o resultado é arredondado para o tipo float antes de ser atribuído a f_short.

No exemplo a seguir (que usa as declarações do exemplo anterior), a aritmética é feita em precisão flutuante (32 bits) nas variáveis; o resultado é então promovido para o tipo double:

f_longer = f_short * f_short;

Ver também

Armazenamento de Tipos Básicos