pontoflutuante
pontoflutuante
pontoflutuante
Entre 1970 e 1980 um grupo formado por cientistas e engenheiros de diferentes em-
presas de computação realizou um trabalho intenso na tentativa de encontrar um padrão
de representação dos números, que deveria ser adotado por todas as indústrias na cons-
trução de seus computadores. A necessidade desta padronização tinha como principal
objetivo uniformizar os resultados obtidos por um mesmo programa computacional exe-
cutado em diferentes máquinas, [1].
Esta discussão teve inı́cio em 1976, e este grupo de trabalho ficou conhecido como
IEEEp754, pois foi organizado pelo Institute for Electrical and Electronics Engineers
IEEE. Entre os fabricantes estavam Apple, Zilog, DEC, Intel, Hewlett-Packard, Motorola
e National Semiconductor. O prof. William Kahan liderava o grupo de cientistas e pelo
trabalho desenvolvido neste projeto, recebeu o prêmio Turing Prize em 1989, [1].
• estabelecer critérios para padronizar situações como divisão por zero, operações
envolvendo infinito.
Em 1985 o resultado deste trabalho foi publicado e ficou conhecido oficialmente como
ANSI/IEEE Std 754-1985, [2].
1
1 bit é reservado para o sinal do número (positivo ou negativo);
8 bits são reservados para o expoente da base, que é um número inteiro;
23 bits são reservados para a mantissa:
± e1 e2 . . . e8 d1 d2 . . . d23
Para obter a forma como o expoente será armazenado podemos também trabalhar
na base 10 e depois converter o resultado final. Por exemplo, se e = (52)10 iremos
armazenar (127)10 + (52)10 = (179)10 = (10110011)2 .
O maior expoente é representado pela sequência (11111110)2 que, na base 10, repre-
senta o número (256 − 2)10 = (254)10 . Então o maior expoente é: 127 + e = 254 ⇒ e =
254 − 127 = 127.
2
Por exemplo, o número (1/8)10 = (0.125)10 = (0.001)2 será assim armazenado:
0 01111100 0000 . . . 0
0 01111011 10011001100110011001100
0 00000001 00000000000000000000000
O maior número positivo terá como mantissa um número com 24 bits iguais a um e
como expoente (11111110)2 = (1.1111 . . . 11)2 ∗2127 = (2−2−23 )∗2127 ≈ 2128 ≈ 3.4∗1038 .
No formato IEEE754 teremos este número assim representado:
0 11111110 11111111111111111111111
3
1 11111111 00000000000000000000000
0 11111111 00000000000000000000000
O zero é representado com as sequências de bits todos nulos tanto para o expoente
quanto para a mantissa:
0 00000000 00000000000000000000000
Se a sequência de bits para o expoente for nula e a sequência de bits para a mantissa
for não nula então, temos a ocorrência de números menores que 2−126 ≈ 1.2 ∗ 10−38 , que
não estarão na forma normalizada, isto é, o primeiro dı́gito da mantissa não será igual
a 1. Por exemplo:
0 00000000 1000000000000000000000
0 00000000 00000000000000000000001
Se a sequência de bits para o expoente for composta por todos dı́gitos iguais a um e a
sequência de bits para a mantissa for não nula então temos o ocorrência dos denominados
NaN: Not a Number, que representam resultados de expressões inválidas como:
0 ∗ ∞;
0/0;
∞/∞;
∞ − ∞.
Há um consenso que certas expressões, ainda que envolvam ∞ ou zero, tenham um
resultado plausı́vel, tais como:
z ∗ 0 = 0;
z/0 = +∞, se z > 0;
4
z/0 = −∞, se z < 0;
z ∗ ∞ = ∞.
∞ + ∞ = ∞.
Observamos que a justificativa para a convenção em se adotar NaN para ∞−∞ segue
do estudo de limite de sequências. Por exemplo, se duas sequências, zk e wk divergem
para +∞, então, a adição dos termos de sequência, resultará em outra sequência, tk =
zk + wk , que também diverge para +∞. Porém, se subtrairmos os termos das sequências,
tk = zk − wk , nada poderemos afirmar sobre a sequência resultante, pois o seu limite
dependerá da rapidez de convergência de cada sequência envolvida.
Em alguns casos, pode ser necessário trabalhar com precisões maiores, ou ainda,
pode ser necessário trabalhar com números bastante grandes ou muito pequenos. Para
estes casos, é conveniente trabalhar com o sistema de precisão dupla, que permite uma
precisão maior para a mantissa e também intervalos maiores para o expoente.
± e1 e2 . . . e11 d1 d2 . . . d52
E, o maior expoente representado neste sistema será dado pela sequência de bits,
11111111110, que corresponde ao número 211 −2 = 2046. Daı́, teremos 2046 = 1023+e ⇒
e = 2046 − 1023 = 1023.
5
Operações em Aritmética de Ponto Flutuante
A adição em ponto flutuante requer que as parcelas tenham o mesmo expoente para
que as mantissas possam ser adicionadas. Para isto, a mantissa do número de menor
expoente deve ser deslocada para a direita. Este deslocamento deve ser de um número
de casas decimais iguais à diferença entre os dois expoentes.
Este é o resultado exato desta operação. Dado que no sistema adotado o número de
dı́gitos na mantissa é igual a 4, o resultado z deverá ser armazenado neste sistema. Se
for usado o arredondamento, teremos, z = 0.9383 ∗ 104 e se for usado o truncamento,
teremos, z = 0.9382 ∗ 104 .
6
A propriedade do elemento neutro na adição de números reais: (existe e é único o
número real ē tal que a + ē = 0, ∀a ∈ R), não se verifica na adição em ponto flutuante,
pois cada número representado exatamente no sistema admite um conjunto de elementos
neutros.
7
Referências Bibliográficas