Em ciência da computação , o IEEE 754 é um padrão para aritmética de ponto flutuante desenvolvido pelo Institute of Electrical and Electronics Engineers . Atualmente, é o padrão mais usado para calcular números de ponto flutuante com CPUs e FPUs . O padrão define os formatos de representação dos números de ponto flutuante ( sinal , mantissa , expoente , números desnormalizados ) e valores especiais ( infinito e NaN ), junto com um conjunto de operações de ponto flutuante. Também descreve cinco modos de arredondamento e cinco exceções (incluindo as condições em que ocorre uma exceção e o que acontece nesse caso).
A versão original do IEEE 754, datada de 1985, definiu quatro formatos para representar números de ponto flutuante de base 2:
Por exemplo, na linguagem C , o compilador gcc para arquiteturas compatíveis com Intel de 32 bits usa o formato precisão simples para variáveis do tipo float , precisão dupla para variáveis do tipo duplo e precisão dupla ou precisão dupla estendida (seguindo o sistema operacional) para variáveis duplas longas . No entanto, se a extensão SSE2 não for usada, todos os cálculos são arredondados para a mesma precisão, dependendo da configuração de precisão dinâmica do processador (normalmente precisão dupla ou precisão dupla estendida, dependendo do sistema operacional, opções de compilação e alterações feitas por programas).
O título completo do padrão era Padrão IEEE para Aritmética de Ponto Flutuante Binário (ANSI / IEEE Std 754-1985 ). É também conhecido pelo nome de IEC 60559: 1989, Aritmética de ponto flutuante binário para sistemas microprocessados , o que também o torna um padrão (americano), desde que aprovado como referência normativa em vários padrões internacionais ISO. No entanto, este padrão foi estendido por uma grande revisão em 2008 para outros formatos básicos (binário em 128 bits e decimal em 64 e 128 bits), bem como formatos de troca (adicionando formatos que são menos precisos ou mais precisos) e formatos estendidos ( generalização do padrão de 1985, com mais liberdade de precisão e codificação do que com formatos de troca); esta revisão também inclui modos de arredondamento adicionais e requisitos de conformidade mais rigorosos com relação à precisão esperada de cálculos e operações transcendentais básicas. Essa norma também foi revisada em 2019.
Em uma palavra de comprimento W, os bits são indexados de 0 a W - 1, inclusive. O bit 0 é colocado à direita e representa o bit menos significativo (ou seja, o bit de unidades, que causará a menor variação se alterado).
Um número de ponto flutuante é composto por três elementos: a mantissa , o expoente e o sinal. O bit mais significativo é o bit de sinal : se este bit estiver em 1, o número é negativo, e se estiver em 0, o número é positivo. Os próximos e bits representam o expoente polarizado (exceto valor especial) e os próximos m bits ( m bits menos significativos) representam a mantissa.
Assinar | Expoente de polarização | Mantissa |
(1 bit) | ( e bits) | ( m bits) |
O expoente pode ser positivo ou negativo. No entanto, a representação usual de números com sinais ( complemento de 2 ) tornaria a comparação entre os números de ponto flutuante um pouco mais difícil. Para resolver este problema, o expoente é "enviesado", a fim de armazená-lo como um número sem sinal.
Essa tendência é 2 e −1 - 1 ( e representa o número de bits no expoente); é, portanto, um valor constante uma vez que o número de bits e seja fixo.
A interpretação de um número (diferente do infinito) é, portanto: valor = sinal × mantissa × 2 ( expoente - viés ) com
O bit mais significativo da mantissa é determinado pelo valor do expoente polarizado. Se o expoente polarizado for diferente de 0 e de , o bit mais significativo da mantissa é 1 e o número é considerado "normalizado". Se o expoente polarizado for zero, o bit mais significativo da mantissa é zero e o número é desnormalizado .
Existem três casos especiais:
Podemos resumir da seguinte forma:
Modelo | Expoente de polarização | Mantissa |
---|---|---|
Zeros | 0 | 0 |
Números desnormalizados | 0 | diferente de 0 |
Números normalizados | no | algum |
Infinito | 0 | |
NaNs | diferente de 0 |
Um número de ponto flutuante de precisão simples é armazenado em uma palavra de 32 bits: 1 bit de sinal, 8 bits para o expoente e 23 para a mantissa.
O expoente é, portanto, enviesado neste caso. O expoente de um número normalizado, portanto, vai de -126 a +127. O expoente -127 (que é polarizado em direção ao valor 0) é reservado para números zero e desnormalizados, enquanto o expoente 128 (polarizado em direção a 255) é reservado para codificar infinitos e NaNs (consulte a tabela anterior).
Um número de ponto flutuante normalizado tem um valor v dado pela seguinte fórmula:
v = s × 2 e × m .Por exemplo, para 0b 0 01111100 01000000000000000000000: o sinal é positivo, o expoente é 124 - 127 = −3 e a parte significativa é 0b 1,01, ou seja, 1,25 em decimal (1 × 2 0 + 0 × 2 −1 + 1 × 2 - 2 ); o número representado é, portanto, +1,25 × 2 −3 ou +0,15625.
Os números desnormalizados seguem o mesmo princípio, exceto que e = −126 e m = 0+ mantissa (nota: para o cálculo, tomaremos o cuidado de tomar e = −126 e não −127, a fim de garantir a continuidade deste representação com a representação normalizada, uma vez que m = 0+ mantissa e não mais m = 1+ mantissa ).
Notas:
Aqui está uma tabela que resume a parte anterior, com exemplos de números de 32 bits de precisão única.
Modelo | Expositor | Mantissa | Valor aproximado | Desvio / anterior |
---|---|---|---|---|
Zero | 0000 0000 | 000 0000 0000 0000 0000 0000 | 0,0 | |
Menor número desnormalizado | 0000 0000 | 000 0000 0000 0000 0000 0001 | 1,4 × 10 −45 | 1,4 × 10 −45 |
Próximo número desnormalizado | 0000 0000 | 000 0000 0000 0000 0000 0010 | 2,8 × 10 −45 | 1,4 × 10 −45 |
Próximo número desnormalizado | 0000 0000 | 000 0000 0000 0000 0000 0011 | 4,2 × 10 −45 | 1,4 × 10 −45 |
Outro número desnormalizado | 0000 0000 | 100 0000 0000 0000 0000 0000 | 5,9 × 10 −39 | |
Maior número desnormalizado | 0000 0000 | 111 1111 1111 1111 1111 1111 | 1,175 494 21 × 10 −38 | |
Menor número padronizado | 0000 0001 | 000 0000 0000 0000 0000 0000 | 1,175 494 35 × 10 −38 | 1,4 × 10 −45 |
Próximo número padronizado | 0000 0001 | 000 0000 0000 0000 0000 0001 | 1,175 494 49 × 10 −38 | 1,4 × 10 −45 |
Quase o dobro | 0000 0001 | 111 1111 1111 1111 1111 1111 | 2.350 988 56 × 10 −38 | 1,4 × 10 −45 |
Próximo número padronizado | 0000 0010 | 000 0000 0000 0000 0000 0000 | 2.350 988 70 × 10 −38 | 1,4 × 10 −45 |
Próximo número padronizado | 0000 0010 | 000 0000 0000 0000 0000 0001 | 2.350 988 98 × 10 −38 | 2,8 × 10 −45 |
Quase 1 | 0111 1110 | 111 1111 1111 1111 1111 1111 | 0,999 999 94 | 0,6 × 10 −7 |
1 | 0111 1111 | 000 0000 0000 0000 0000 0000 | 1.000.000 00 | |
Próximo número 1 | 0111 1111 | 000 0000 0000 0000 0000 0001 | 1.000.000 12 | 1,2 × 10 -7 |
Quase o maior número | 1111 1110 | 111 1111 1111 1111 1111 1110 | 3.402 823 26 × 10 38 | |
Maior número padronizado | 1111 1110 | 111 1111 1111 1111 1111 1111 | 3.402 823 46 × 10 38 | 2 × 10 31 |
Infinito | 1111 1111 | 000 0000 0000 0000 0000 0000 | Infinito | |
Primeiro valor (desnormalizado) de aviso NaN | 1111 1111 | 000 0000 0000 0000 0000 0001 | não | |
NaN normalizado (alarme) | 1111 1111 | 010 0000 0000 0000 0000 0000 | não | |
Último valor (desnormalizado) de aviso NaN | 1111 1111 | 011 1111 1111 1111 1111 1111 | não | |
Primeiro valor (desnormalizado) de NaN silencioso | 1111 1111 | 100 0000 0000 0000 0000 0000 | não | |
Último valor (desnormalizado) de NaN silencioso | 1111 1111 | 111 1111 1111 1111 1111 1111 | não |
Notas:
Vamos codificar o número decimal -118.625 usando o mecanismo IEEE 754.
Portanto, temos −118,625 (dec) = 1100 0010 1110 1101 0100 0000 0000 0000 (bin) = C2ED4000 (hexa).
O formato de precisão dupla é igual ao de precisão simples, exceto que os campos são maiores. Na verdade, ele tem 52 bits de mantissa em vez de apenas 23 e 11 bits de expoente em vez de apenas 8.
A mantissa é muito ampla, enquanto o expoente não é muito amplo. Isso porque, segundo os criadores do padrão, a precisão é mais importante do que a amplitude.
Os NaNs e os infinitos são representados pela definição de todos os bits do expoente em 1 (2047), mas diferenciados pela definição de todos os 52 bits da mantissa em 0 para os infinitos e pelo menos um desses 52 bits em 1 para o Nope .
Para números normalizados, o viés do expoente é +1023. Para números desnormalizados, o expoente é −1022 (o expoente mínimo para um número normalizado). Não é −1023 porque os números normalizados têm um 1 antes da vírgula decimal e os números desnormalizados não. Como antes, zero e infinito são assinados.
Notas:
Geralmente, é melhor comparar números de ponto flutuante usando as instruções de cálculo de ponto flutuante. No entanto, essa representação possibilita comparações de certos subconjuntos byte a byte, se eles tiverem a mesma ordem de bytes e o mesmo sinal, e os NaNs forem excluídos.
Por exemplo, para dois números de ponto flutuante positivo a e b, a comparação entre a e b (>, <, ou ==) dá os mesmos resultados que a comparação de dois números com sinal (ou sem sinal) com os mesmos bits que a e b. Em outras palavras, dois números de ponto flutuante positivo (que não são NaNs) podem ser comparados com uma comparação binária com sinal (ou sem sinal). Devido ao problema de ordem de bytes, essa comparação não pode ser usada em código portátil.
O padrão IEEE especifica 5 modos de arredondamento:
Dentro junho de 2008, uma revisão importante dos padrões IEEE 754 e IEEE 854 foi aprovada pelo IEEE. Veja: IEEE 754-2008 (en) .
Esta revisão traz novos formatos de base 2 e 10, e especifica a representação dos formatos de base 10 (além da base 2).
Ele também normaliza uma relação de ordem total para cada um dos tipos de dados numéricos normalizados, suplementando as relações de ordem usuais que são apenas parciais; na verdade, a relação de ordem normal é total apenas com a condição de remover do conjunto de valores, o valor zero negativo (normalmente comparado como igual ao valor zero positivo) e todos os valores NaN (que não são iguais, nem superiores, nem inferior a qualquer outro, nem mesmo eles).
Por outro lado, esta revisão deixa a flexibilidade de representação e possível distinção dos valores NaN (a posição e o valor do (s) bit (s) de aviso no campo da mantissa não são padronizados, e o uso dos outros bits de o campo mantissa ou sinal de um valor NaN para codificar um erro permanece dependente da arquitetura ou dos aplicativos).
Uma nova revisão foi aprovada em julho de 2019.