Vous êtes sur la page 1sur 7

DESVENDANDO OS

NÚMEROS DE PONTO FLUTUANTE

Autor: Diego Dias Sueiro

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:

números reais ponto flutuante


123,45 1,2345x102 Expoente

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:

SN Expoente (e) Mantissa(M)


Onde:
SN – Sinal do número.

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:

Número máximo de elementos representados:


número de elementos = 2  B−1 Bt−1 e max −e min11
Maior número representável :
maior número = Be 1− B−t 
max

Menor número representável:


menor número = Be B−1 min

Maior intervalo:
maior intervalo = Be B−tmax

Menor intervalo:
menor intervalo = Be B−t min

Abaixo a Tabela 1 mostra os parâmetros para alguns computadores digitais. Onde u


representa o menor número para arredondamento.

Máquina e Aritmética B t emin emax u


Cray-1 Precisão Simples 2 48 -8192 8191 4x10-15
Cray-1 Precisão Dupla 2 96 -8192 8191 1x10-29
DEC VAX formato G Dupla 2 53 -1023 1023 1x10-16
DEC VAX formato D Dupla 2 56 -127 127 1x10-17
IEEE Precisão Simples 2 24 -126 127 6x10-8
IEEE Precisão Dupla 2 53 -1022 1023 1x10-16
IEEE Precisão Extendida 2 64 -16381 16384 5x10-20
PDP 11 2 24 -128 127 1,19x10-7
Control Data 6600 2 48 -976 1070 7,11x10-15
Calculadoras HP 28 e 48G 10 12 -499 499 5x10-12
IBM 3090 Precisão Simples 16 6 -64 63 5x10-7
IBM 3090 Precisão Dupla 16 14 -64 63 1x10-16
IBM 3090 Precisão Estendida 16 28 -64 63 2x10-33
Tabela 1 – Parâmetros Aritméticos de Pontos Flutuantes.

O Padrão IEEE 754

O padrão recomenda normas relativas ao armazenamento dos dados numéricos, tratamento


de casos de underflow e overflow, métodos de arredondamento, formas de realização das quatro
operações básicas da matemática e implementação de funções nas linguagens de programação. Com
isso tem-se o objetivo de tornar o código portável.
É proposto uma normalização do número que consiste em manter a mantissa o mais próximo
de 1 (um), nunca ultrapassando este valor. Existem dois tipos de representações:

Número Normalizado Número Desnormalizado


1.d1d2d3...dt x 2e 0.d1d2d3...dt x 2emin

Onde e é o valor do menor expoente menos 1 ( e = emin -1 ).


Temos que um número de ponto flutuante pode ser da seguinte maneira:
± 0,M x B± e
Onde M é a mantissa, B a base e e o expoente.

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.

Figura 1 – Tipos de número de ponto flutuante.

Há uma limitação na representação dos números reais em pontos flutuantes devido a:


−1 −t
 mantissa representar um número finito de números  B M 1−B  ;
 faixa dos expoentes limitada e min ee max  .
No primeiro caso temos o erro de arredondamento relacionado à precisão do número, já no
segundo encontramos os casos de underflow e overflow.
Para problemas relacionados ao arredondamento, o padrão define quatro métodos:

1. Em direção a zero – arredonda para o valor imediatamente anterior para valores


positivos, e para o valor imediatamente posterior para negativos:

N = + 0.67521 → N' = + 0.675


Y = - 0.67521 → Y' = – 0.675

2. Em direção a +∞ (por excesso) – arredonda para o maior valor relativo:

N = + 0.67521 → N' = + 0.676


Y = - 0.67521 → Y' = – 0.675

3. Em direção a -∞ (por truncamento) – arredonda para o menor valor relativo:

N = + 0.67521 → N' = + 0.675


Y = - 0.67521 → Y' = – 0.676

4. Em direção ao mais próximo – arredonda para o valor mais próximo de máquina, em


caso de empate arredonda para o próximo par (o mais recomendado pelo IEEE754).

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.

Figura 2 – Regiões de ocorrência de overflow e underflow.

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:

X = (–1)SN . be .(0.d1d2d3 .....dt)


Onde emin ≤ e ≤ emax

O padrão IEEE 754 recomenda os seguintes números de bits, de acordo com a


precisão usada. A expressão ( N = SN + e + t ), corresponde ao tamanho da palavra em
bits.
a) Precisão Simples: SN = 1, e = 8, f = 23 (+ 1 escondido), N = 32 bits.
e−
X =1.f ∗2  δ = 127

b) Precisão Simples Estendida: SN = 1, e ≥ 11, f ≥ 32 , N ≥ 43 bits.


e−
X =0.f ∗2  δ = 127

c) Precisão Dupla : SN = 1, e = 11, f = 52 (+ 1 escondido), N = 64 bits.


e−
X =1.f ∗2  δ = 1203

d) Precisão Dupla Estendida: SN = 1, e ≥ 15, f >= 64 , N ≥ 79 bits.


X =0.f ∗2e−  δ = 1203

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.

Cálculo de erro nas operações aritméticas

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)

Y= 0 51 7595 => Y= 0 53 0075 9

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.

a) Evite subtrações com valores que contenham parcela de erro;


b) Minimize o tamanho dos valores intermediários em relação ao valor final;
c) Utilize diferentes formulações para o cálculo que retornem valores numéricos diferentes
mas com funções matematicamente iguais;
d) Quando usado muitos dígitos significativos adicione uma parcela de erro ao resultado
final;
e) Evite cálculos que resultem em overflow/underflow.

Fique por dentro

 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

Vous aimerez peut-être aussi