1
A norma IEEE 754 em Matlab 1. Representação dos números em ponto flutuante. A norma IEEE 754 define dois formatos básicos para os números em ponto flutuante, FP (b, p, q): o formato simples, com 32 bits e o formato duplo, com 64 bits. Assim a base da representação é binária (b=2). O MATLAB segue a norma IEEE 754 com 64 bits. Para comprová-lo basta observar os valores das variáveis realmin e realmax e da sua precisão (eps). A norma IEEE em formato duplo representa os números em unidades de memória NSU (Numerical Storage Unit) de 64 bits distribuídas em três zonas: # bits
1
11
S
expoente
52
mantissa
1. Sinal – o primeiro bit é usado para o sinal da mantissa: o S=0 para números positivos o S=1 para números negativos 2. Expoente – os 11 bits seguintes são reservados para o expoente. o O menor expoente possível: e = -1022 (00000000001) o O maior expoente possível: e = 1023 (11111111110) O expoente é enviesado, o que significa que para se obter um expoente tal que -1022 ≤ e ≤ 1023, subtrai-se 1023 (210 -1) ao expoente que está realmente armazenado (em 11 bits podemos representar números desde 0 até 2047 = 211-1). O expoente enviesado permite assim usar os 11 bits para representar expoentes negativos e positivos. Note que o maior número possível que podemos representar com 11 bits é 2047 = 11111111111, e que 2047-1023 = 1024 é um número maior que o maior expoente possível (1023). O número 2047 = 11111111111 é reservado para representar a condição de OVERFLOW. Similarmente, o expoente com todos os bit nulos 0 = 00000000000 é reservado para representar a condição de UNDERFLOW e indicar que o número deixa de ser normalizado (ver mais detalhes a continuação). 3. Mantissa – dispõe de 52 bits e é normalizada seguindo a norma 1 ≤ mantissa < 2. Assim, o primeiro bit da mantissa é sempre 1 (bit implícito) e não é necessário armazená-lo. Por conseguinte, embora se usem 52 bits para a mantissa, na realidade p = 53. Assim, a norma IEEE em formato duplo permite representar números na forma:
N = (-1)S × 2 e-1023 × (d0. d-1 d-2 d-52 )
2 em que s = 0, 1 é o sinal da mantissa, 0 < e < 2047 é o expoente e os dk são bits, i.e., dk=0, 1 com d0=1 se o número for normalizado e d0=0 se o não for.
2. Machine Epsilon
O parâmetro real que representa a unidade de precisão de um computador (este varia de computador a computador): O número real positivo mais pequeno que somado a 1 o modifica, ou seja, o menor valor positivo u representável que satisfaz: 1 + u > 1.
O Matlab armazena a precisão com a qual trabalha na variável eps. » eps
ans = 2.220446049250313e-016
» 2^-52
ans = 2.220446049250313e-016 -52
Assim, eps = 2
≈
2.2204e-016
3. Condição de OVERFLOW.
A condição de OVERFLOW acontece quando o resultado de uma operação é um número superior ao maior número representável, que no caso do formato duplo corresponde ao número:
21023 x 1.111…1 = 21023 x (2 - 2-52) Note que (2 - 2-52 ) representa o maior número menor que 2, tendo em conta a precisão eps = 2-52.
O Matlab armazena o maior número representável na variável realmax. » realmax
ans = 1.797693134862316e+308
» 2^1023*(2-2^-52) ans = 1.797693134862316e+308
3
A condição de OVERFLOW é representada por uma configuração de bits do expoente igual a 11111111111, razão pela qual esta configuração do expoente havia sido reservada. o se a mantissa for exactamente 0, então esta configuração representa (-1)S ∞ o se a mantissa for diferente de 0, a norma indica uma de duas alternativas: uma situação de erro fatal com interrupção do programa a emissão de um código especial de NaN (not a number) Por exemplo, em Matlab, podemos verificar a condição de OVERFLOW quando introduzirmos o número 2^1024, um número superior ao maior número representável. >> 2^1023 ans = 8.988465674311580e+307 >> 2^1024 ans = Inf % devolve infinito.
4. Condição de UNDERFLOW.
A condição de UNDERFLOW acontece quando o resultado de uma operação é um número inferior ao menor número representável, que no caso do formato duplo corresponde ao número:
2-1022 x 1.000…0 = 2-1022 x 20 = 2-1022
O Matlab armazena o menor número representável na variável realmin. » realmin ans = 2.225073858507201e-308 >> 2^-1022 ans = 2.225073858507201e-308
A solução perante UNDERFLOW é atribuir um valor 0 ao resultado, e continuar com as operações, ou seja, o programa não é interrompido. Esta solução é conhecida por UNDERFLOW súbito.
4 Seguindo o exemplo anterior com a condição de OVERFLOW, pudéssemos verificar a condição de UNDERFLOW se introduzirmos o número 2-1023 em Matlab. Este número é inferior ao menor número representável. >> 2^-1023 ans = 1.112536929253601e-308 >> 2^-1030 ans = 8.691694759793755e-311 Mas como podemos verificar a situação de UNDERFLOW não é detectada. Se continuarmos verificando para números menores podemos apurar que a situação de UNDERFLOW só ocorre a partir do expoente -1075. >> 2^-1074 ans = 4.940656458412465e-324 >> 2^-1075 ans = 0 Isto acontece porque o Matlab implementa a técnica de UNDERFLOW GRADUAL.
5. Técnica de UNDERFLOW GRADUAL. Esta técnica prescrita pela norma IEEE 754 consiste em desistir de ter mantissas normalizadas quando ocorrer UNDERFLOW, Por exemplo, se o resultado de uma operação em formato duplo fosse 2-1024 , então este seria representado pelo número: 0 00000000000 0100000000000000… 00000 em que o expoente com todos os bits nulos serve para indicar que o número não é normalizado. Assim, esta representação especial deve ser interpretada como representando um número cujo expoente é o menor possível, 2-1022 , e cuja mantissa é 2-2 , ou seja o número 2-1024. Como resultado a técnica de UNDERFLOW GRADUAL possibilita que o menor número representável em formato duplo, seja um número cujo expoente é o menor possível, 2-1022 , e cuja mantissa seja o número que mais se aproxima a zero, ou seja, a precisão eps = 2-52. Assim obtemos o número
2-1022 x 0.000…1 = 2-1022 x 2-52 = 2-1074 Números inferiores a este são postos a zero. Métodos Numéricos, IFAM., 2013