Difference between revisions 32274730 and 32694813 on ptwikiO 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]] All content in the above text box is licensed under the Creative Commons Attribution-ShareAlike license Version 4 and was originally sourced from https://pt.wikipedia.org/w/index.php?diff=prev&oldid=32694813.
![]() ![]() This site is not affiliated with or endorsed in any way by the Wikimedia Foundation or any of its affiliates. In fact, we fucking despise them.
|