As estruturas dos tipos de ponto flutuante definidas para o padrão IEEE 754:2008

A linguagem C, via padrão ISO 9899:1999 ou superior, define 4 tipos de “ponto flutuante”: float, double, long double e __float128. Eis a estrutura de cada uma delas:

Tipo Bits significativos Bits do expoente “Bias” do expoente
float 24 8 2^7-1=127
double 53 11 2^{10}-1=1023
long double 64 15 2^{14}-1=16383
__float128 113 15 2^{14}-1=16383

Todos eles funcionam da mesma forma, exceto pelo tipo long double: Existe um bit 1, inteiro, implícito nos bits significativos e, por isso, no tipo float a soma dos bits dá 32, considerando o bit de sinal teríamos 33 bits, mas com o bit implícito, voltamos para o limite de 32 bits ou um DWORD.

Com o tipo double o tamanho é de 64 bits. E com o tipo __float128 se passa o mesmo, mas para 128 bits. O tipo long double foge a regra porque o bit “implícito” é “explícito”, ele faz parte da representação, daí os 79 bits mais o bit de sinal nos dá exatamente 80 bits (10 bytes).

Como de praxe, expoentes que tem “bias” máximo negativo (ou seja, seu valor binário é zero!) expressam o valor 0.0 se a parte fracionária dos bits significativos também forem zero (e, no caso do long double, se o bit inteiro também for zero!) ou, caso contrário, um valor subnormal… Se o “bias” for máximo (todos os bits setados), indica um NaN ou um dos infinitos, dependendo do sinal.

Quanto ao “bias”, vale lembrar que, num float, E=e-127, onde e é o valor inteiro sem sinal expresso no expoente… No caso do double, E=e-1023, no caso do long double e do __float128, E=e-16383… Quando e=0 o valor subnormal é multiplicado pela escala 2^{E+1}.

IEEE 754:2008 define, ainda, o tipo binary256, mas esse não é implementado na especificação do C, pelo menos até a versão mais recente.

Anúncios