Difference between revisions 32274730 and 32694813 on ptwiki

O padrão IEEE 754 (definido pelo [[Instituto de Engenheiros Eletricistas e Eletrônicos]])  foi adotado em 1985 e desde então passou por algumas modificações,  e define algumas regras de normalização a serem seguidas nas operações e representações de números binários com [[ponto flutuante]].  Antes disso, cada fabricante de computadores e outros dispositivos, possuía um formato de representação diferente.

== Normalização ==
Para que o número esteja de acordo com as normas, deve obedecer a seguinte configuração:

<code>S M * 2<sup>E</sup></code>

onde S é o sinal, M é a mantissa ou parte fracionaria, 2 é a base (binário) e E é o expoente. Deve ter a mesma forma utilizada em [[notação científica]].

Na representação em bits, usa-se a seguinte configuração:
<table border=1 cellspacing=0 cellpadding=5>
<tr align="center"> 
<th>Sinal</th>
<th>Expoente</th>
<th>Mantissa</th>
</tr>
</table>

Exemplo:

+ 9,5 decimal => + 1,1001 * 2³  

<table border=1 cellspacing=0 cellpadding=5>
<tr align="center">
<th>0</th
><th>10000010</th>
<th>00110000000000000000000</th>
</tr>
</table>

=== Sinal ===
Independente do sistema de precisão utilizado, o sinal sempre é representado por apenas um bit, podendo ser negativo (1) ou positivo (0).

=== Arredondamento ===
Embora o arredondamento possa alterar ligeiramente o resultado, muitas vezes se faz necessário. Quando isso ocorre, as regras são semelhantes às utilizadas no [[arredondamento]] de números decimais.  Temos:

Arredondamento em direção ao zero (round toward 0): despreza-se os bits “excedentes”;

Arredondamento em direção ao infinito positivo (round toward +∞): arredonda para cima;

Arredondamento em direção ao infinito posinegativo (round toward -∞): arredonda para baixo;

Arredondamento para o mais próximo (round to the nearest): quando está entre dois números, aproxima-se para o mais próximo, devendo terminar em zero.

 Exemplo:
 Número inicial: 1,0011101 (está entre 1,0011 e 1,0100)

<table border=1 cellspacing=0 cellpadding=5>
<tr align="center">
<th>Tipo de Arredondamento</th>
<th>Final</th>
</tr>
<tr align="center">
<td>Para zero</td>
<td>1,0011</td>
</tr>
<tr align="center">
<td>Para +∞</td>
<td>1,0100</td>
</tr>
<tr align="center">
<td>Para -∞</td>
<td>1,0011</td>
</tr>
<tr align="center">
<td>Aproximação</td>
<td>1,0100</td>
</tr>
</table>

=== Parte Inteira ===
Deve haver apenas um número antes da vírgula, ou seja, o 1. Porém, somente a parte fracionária do número é representada, pois a parte inteira, que sempre será 1, fica implícita. Assim, o bit que deixou de ser ocupado, poderá ser utilizado pelo expoente, proporcionando uma maior precisão. 

=== Expoente ===
O expoente deve ser ajustado de acordo com as normas, sendo somado ao número padronizado -Bias- 127 (simples)  ou 1023 (dupla).

== Precisão ==
[[Imagem:Precisao_simples.png|png|300px|thumb|Distribuição dos bits. Precisão simples]]
[[Imagem:Precisao_dupla.png|png|300px|thumb|Distribuição dos bits. Precisão dupla]]
Quanto à precisão da representação numérica, as principais são:

;Simples
* 32 bits ou precisão simples (float), equivalente a até 7 dígitos decimais.
* 1 bit para o sinal.
* 8 bits para o expoente.
* 23 bits para a representação da mantissa.

;Dupla
* 64 bits ou precisão dupla (double), equivalente a até 15 dígitos decimais.
* 1 bit destinado para o sinal;
* 11 bits destinados para o expoente;
* 52 bits destinados para a mantissa.

== Valores Especiais ==
<table border=1>
<tr>
<th>Valor</th>
<th>Sinal</th>
<th>Expoente</th>
<th>Mantissa</th>
</tr>
<tr>
<th>Zero</th>
<td>0</td>
<td>0s</td>
<td>1s</td>
</tr>
<tr>
<th>+ Infinito</th>
<td>0</td>
<td>1s</td>
<td>1s</td>
</tr>
<tr>
<th>- Infinito</th>
<td>1</td>
<td>1s</td>
<td>1s</td>
</tr>
<tr>
<th>NaN</th>
<td>0</td>
<td>1s</td>
<td>Diferente de 0s</td>
</tr>
</table>
No padrão IEEE 754, os [[NaN]] (Not a Number), possuem sinal 0, expoente 1 e mantissa com qualquer valor - exceto tudo 0s, pois isso caracteriza infinito- e representam exceções como divisão por zero, raiz de negativos etc. 

== Convertendo número decimal para binário ==
Tomando por base o primeiro exemplo, -9.5, vamos representá-lo como ponto  flutuante com precisão 32 bits.
Exemplo:

<pre>
Sinal negativo →  1
9,5 para binário → 1001,1
deslocamos a vírgula → 1,0011 * 2³
agora que temos o expoente 3, devemos normalizá-lo → 3+127 = 130
em binário temos 3 = 11 e 127 = 1111111, somando os dois temos → 10000010
</pre>

Resultado:
<table border=1 cellspacing=0>
<tr align="center">
<th>1  10000010  00110000000000000000000</th>
</tr>
</table>

Os espaços restantes são preenchidos com zeros.

== Convertendo número binário para decimal ==
Para converter binários de ponto flutuante para decimal, devemos fazer o inverso do que fizemos acima.

Primeiramente, devemos identificar os componentes e decompô-los em sinal, expoente (8 ou 11 bits) e o restante será a mantissa.

Não devemos esquecer de recompor a parte inteira, ou seja o 1.
 
;Exemplo:
<table border=1 cellspacing=0>
<tr align="center">
<th>1</th>
<th>10000010</th>
<th>00110000000000000000000</th>
</tr>
<tr align="center">
<th>sinal</th>
<th>expoente</th>
<th>fração</th>
</tr>
</table>

 expoente → 130-127 = 3
 reconstituindo a parte inteira e adicionando-a a mantissa → 10011
 adicionando a vírgula → 1,0011
 deslocando-a de acordo com o expoente → 1001,1
 convertendo para decimal → 9,5
 adicionando o sinal → - 9,5

== Aritmética com ponto flutuante ==
Quando são feitas adição ou subtração,  os números devem ter os mesmos expoentes – movendo a vírgula. Após isso, os cálculos são efetuados normalmente.

Em divisões e multiplicações, não é necessário igualar os expoentes. Procede-se da seguinte forma:

multiplica-se as mantissas e soma-se os expoentes ou divide-se as mantissas e subtrai-se os expoentes, dependendo da operação em questão.

Independente da operação, o resultado deve ser normalizado, se necessário.

==Bibliografia==
*VAHID, Frank. Sistemas Digitais: projetos, otimização e HDLs. São Paulo: Artmed, 2008.

==Ver também==
*[[Ponto flutuante]]
*[[Binário]]
*[[IEEE]]

{{Esboço-redes}}

[[Categoria:Normas IEEE]]
[[Categoria:Aritmética computacional]]

[[ar:آي إي إي إي 754-2008]]
[[ca:IEEE 754]]
[[cs:IEEE 754]]
[[de:IEEE 754]]
[[en:IEEE floating point]]
[[es:IEEE coma flotante]]
[[fr:IEEE 754]]
[[hu:IEEE lebegőpontos számformátum]]
[[it:IEEE 754]]
[[ja:IEEE 754]]
[[ko:IEEE 754]]
[[nl:IEEE 754]]
[[pl:IEEE 754]]
[[ru:IEEE 754-2008]]
[[sr:IEEE 754]]
[[sv:IEEE 754-2008]]
[[tr:IEEE 754-2008]]
[[uk:IEEE 754]]
[[zh:IEEE 754]]