Académique Documents
Professionnel Documents
Culture Documents
Introdução
A representação de números reais na computação pode ser feita por dados do tipo ponto
flutuante. É chamado como ponto flutuante pelo fato de que o ponto decimal pode ser posicionado
em qualquer lugar em relação aos dígitos mais significativos do número. As representações
comumente usadas são definidas pelo padrão IEEE 754.
É possível representar uma faixa extensa de valores reais, porém é menos preciso, necessita
de maior espaço de memória para ser armazenado e maior capacidade de processamento da CPU se
comparado com a representação por ponto fixo. A velocidade de operações com ponto flutuante é
uma importante medida para o desempenho de processadores. Estas medidas podem estar em
megaFLOPS, gigaFLOPS ou teraFLOPS.
O padrão IEEE 754 sugere que os números com ponto flutuante devem ser representados em
notação científica, ou seja, o número 123,45 deve ser representado dessa maneira 1,2345x102 .
Temos:
Base
Parte Inteira (característica) Parte Fracionária (mantissa) Parte Inteira (característica) Parte Fracionária (mantissa)
Vírgula
Um número real sem parte inteira pode ser representado na memória da seguinte maneira:
A soma de SN, Expoente e Mantissa é o valor total de bits para representar o número. A base
utilizada em computares é 2. Matematicamente podemos representar o ponto flutuante como:
e
±. d 1 d 2 d 3 ... d t B
Onde:
d1,d2,d3 e dt - são a mantissa (< 1);
e - é o expoente compreendido em uma faixa entre emax e emin ;
t - é a precisão;
B - é a base.
Quanto maior o número de bits do expoente, maior será a faixa de valores a representar e
quanto maior o número de bits para a mantissa, maior será a precisão.
Para termos uma idéia de como os números de ponto flutuante são representados, tomamos
como exemplo: B = 2; t = 3; emax= 3; emin= -1.
Se considerarmos apenas a parte positiva temos: 0; 0,25; 0,3125; 0,4375; 0,5; 0,625; 0,750;
0,875; 1,0; 1,25; 1,5; 1,75; 2,0; 2,5; 3,0; 3,5; 4,0; 5,0; 6,0; 7,0 no qual podem ser representados em
uma reta:
Vemos que os números não são igualmente espaçados, isso pode trazer problemas de
precisão e arredondamento de cálculos. Abaixo encontramos algumas fórmulas úteis para o uso dos
números de pontos flutuantes:
Maior intervalo:
maior intervalo = Be B−tmax
Menor intervalo:
menor intervalo = Be B−t min
O padrão define dois principais tipos de representação para pontos flutuantes, precisão
simples e precisão dupla. A Figura 1 ilustra a disposição binária do número de ponto flutuante.
N = ± 0.6752 → N’ = ± 0.675
Y = ± 0.6758 → Y’ = ± 0.676
X = ± 0.6755 → X’ = ± 0.676
W = ± 0.6745 → W’ = ± 0.674
Erros de precisão são sempre indesejados e devem ser evitados. Uma análise crítica sobre os
cálculos deve ser feita.
O overflow acontece em operações onde o expoente do resultado é maior que emax e para
operações onde o resultado do expoente é menor que emin, chamamos de underflow. A Figura 2
ilustra o que foi explicado acima.
A maioria dos microcontroladores com suporte a ponto flutuante possuem bits de sinalização
de ocorrência de overflow e underflow.
As operações básicas de matemática devem ser executadas em precisão estendida com uso
de dígitos de guarda e expoente deslocado (δ).
O uso do expoente deslocado, também chamado de característica, tem por objetivo
eliminar o sinal do expoente, por exemplo, se m= –127 e M=127, ( δ deve ser igual
a 127, de forma que a variação de expoente seria de 0 a 254.
Considerando o formato padrão para números de ponto flutuante:
SN e f = d1d2d3...dt
sinal expoente mantissa
E que F (b, t, emin, emax) é um sitema de ponto flutuante podemos representar um número
de ponto flutuante como:
As operações básicas da matemática devem seguir regras. Considerando dois números reais
X e Y, temos:
1. Adição e Subtração:
a) escolher o número com menor expoente entre X e Y e deslocar sua mantissa para
a direita até que o número de dígitos deslocados seja igual à diferença absoluta
entre os respectivos expoentes;
b) o expoente do resultado deve ser igual ao maior expoente entre X e Y;
c) realizar a adição/subtração das mantissas e determinar o sinal do resultado;
d) normalizar o valor do resultado quando necessário;
e) arredondar o valor do resultado quando necessário;
f) verificar a ocorrência de overflow/underflow.
2. Multiplicação:
a) o expoente do resultado deve ser igual à soma dos expoentes de X e Y;
b) realizar a multiplicação das mantissas e obter o sinal do resultado;
c) normalizar o valor do resultado quando necessário;
d) arredondar o valor do resultado quando necessário;
e) verificar a ocorrência de overflow/underflow.
3. Divisão:
a) o expoente do resultado deve ser igual à diferença dos expoentes do dividendo
(X) e do divisor (Y);
b) realizar a divisão das mantissas e determinar o sinal do resultado;
c) normalizar o valor do resultado quando necessário;
d) arredondar o valor do resultado quando necessário;
e) verificar a ocorrência de overflow/underflow.
O IEEE 754 define tipos de dados especiais e exceções nas operações aritméticas, como
mostra a Tabela 2.
Tipo Exemplo Valor IEEE 754 Precisão Simples
SN e M
+NaN 0 1111 1111 010 0000 0000 0000 0000 0000
Operação Inválida 0/0, 0xoo, −1 Not a number
-NaN 1 1111 1111 010 0000 0000 0000 0000 0000
Overflow ou Divisão por Zero + oo infinito positivo 0 1111 1111 000 0000 0000 0000 0000 0000
Underflow ou Divisão por Zero - oo infinito negativo 1 1111 1111 000 0000 0000 0000 0000 0000
+0 0 0000 0000 000 0000 0000 0000 0000 0000
Zero zero
-0 1 0000 0000 000 0000 0000 0000 0000 0000
Tabela 2 – Tipos de dados especiais no IEEE 754.
Para todas operações, faremos o cálculo do erro absoluto e relativo do resultado obtido.
expoente deslocado
Seja F(10, 4, –50, 49), δ = 50, com um dígito de guarda.
b / t / emin / emax
Se X = 436.7 e Y = 7.595
X= 0 53 4367 Y= 0 51 7595
Adição/Subtração:
a) e1 – e2 = 53 –51 = 2 (deslocamento de dois dígitos do menor , no caso Y)
b) Expoente do resultado: e = 5 3
c) Adição das mantissas: 4 3 6 7 (0) + 0 0 7 5 (9) = 4 4 4 2 (9) , onde o valor entre
parênteses é o dígito de guarda.
d) Normaliza o resultado: Não há necessidade, pois d1 = 4 ≠ 0.
e) Arredonda: 4 4 4 2 (9) => f = 4 4 4 3
f) Verifica underflow/overflow: e – 50 = 53 -50 = 3 < 49. Não há
Resultado:
X+Y= 053 4443 ou X + Y = 0.4443 * 1053–50 = 444.3
Análise do resultado:
Erro absoluto = | 444.295 – 444.3 | = 0.01
Erro Relativo = 0.01 / 444.295 = 1.13 x 10-5
Multiplicação:
a) Expoente: e = 53 + 51 = 104
b) Multiplicação das mantissas: (4 3 6 7) * (7 5 9 5) = (3 3 1 6 7 3 6 5), considerando
quatro dígitos de guarda.
c) Normalizar o valor do resultado. Ajustar expoente (e-δ) = 104 – 50 = 54.
d) Arredondar o valor do resultado: (3 3 1 6 7 3 6 5) => (3 3 1 7).
e) Verifica underflow/overflow: e –50 = 54 -50 = 4 < 49. Não há.
Resultado:
X* Y = 0 54 3317 ou X * Y = 0.3317 * 1054–50 = 3317
Análise do resultado:
Erro absoluto = | 3316.7365 – 3317 | = 0.2635
Erro Relativo = 0.2635 / 3316.7365 = 7.9445 x 10-5 (mesma precisão da adição).
Divisão:
a) Expoente: e = 53 – 51 = 2
b) Divisão das mantissas: (4 3 6 7) * (7 5 9 5) = (5 7 4 9 8 3 5 4), considerando quatro
dígitos de guarda.
c) Normalizar o valor do resultado. Ajustar expoente (e+δ) = 2 + 50 = 52.
d) Arredondar o valor do resultado: (5 7 4 9 8 3 5 4) => (5 7 5 0).
e) Verifica underflow/overflow: e –50 = 52 -50 = 2 < 49. Não há.
Resultado:
X/ Y = 0 52 5750 ou X / Y=0.5750 * 1052-50 = 57.50
Análise do resultado:
Erro absoluto = | 57.49835418 – 57.50 | = 0.001645819
Erro Relativo = 0.001645819 / 57.49835418 = 2.8623 x 10-5
Código
Existem diversos projetos com códigos fonte disponível para download utilizando a
aritmética proposta pelo IEEE 754. Podemos destacar:
Netlib (http://www.netlib.org/): é coleção de softwares,papers e databases. Possui a
fdlibm(http://www.netlib.org/fdlibm/index.html) que é uma biblioteca em C com
diversas funções matemáticas e exemplos de utilzação.
General Decimal Arithmetic (http://www2.hursley.ibm.com/decimal/): é uma biblioteca
que implementa aritmética decimal do padrão ANSI C. Suporta formatos do tipo inteiro,
ponto fixo e ponto flutuante (IEEE 754).
SoftFloat(http://www.jhauser.us/arithmetic/SoftFloat.html): é um software em C de
implementação da aritmética de ponto flutuante (IEEE 754).
Dicas para projetos
Não há uma receita de bolo para evitar algoritmos com cálculos imprecisos. Porém podemos
listar algumas dicas úteis a serem seguidas.
http://wwwusers.rdc.puc-rio.br/rmano/rd5nr.html
http://wwwusers.rdc.puc-rio.br/rmano/rd6aritr.html
http://en.wikipedia.org/wiki/Floating_point#Problems_with_floating-point
http://en.wikipedia.org/wiki/IEEE_floating-point_standard
http://www.cs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF
http://www-128.ibm.com/developerworks/power/library/pa-ctypes2/index.html