Aritmética do computador
No computador, expressões como não são verdadeiras. Em Python, ```{python}
(3(1/2))2 2.9999999999999996 ``` Erros de cálculo realizados pela máquina são chamados de erros de arredondamento (round-off error). Isso acontece porque números reais são representados de forma finita, e não cobrem todos os números reais de fato.
Números binários
Em 1985, IEEE (Institute for Electrical and Electronic Engineers) publicou um relatório nomeado Binary Floating Point Arithmetic Standard 754–1985 que estabelece padrões para pontos flutuantes, algoritmos de arredondamento de operações aritméticas e para lidar com exceções.
A representação usual dos números reais é 64-bit (double). O primeiro bit é o sinal do número. Depois vem a característica que é representa o expoente (11-bit) e por fim a fração binária chamada de mantissa (52-bit). Os números são armazenados na base 2.
A representação ponto flutuante dos números é, portanto, em que é o sinal (0 para positivo e 1 para negativo), é o expoente (tiramos o viés 1023 para assegurar que o intervalo de fique entre -1023 e 1024) e é a mantissa.
- Exemplo:
s | c | f |
---|---|---|
0 | 10000000011 | 1011100100010000000000000000000000000000000000000000 |
Nesse caso o sinal é 0, , e e, portanto,
O menor número positivo que pode ser representado é, portanto, e o maior Quando , representamos o 0.
Note que quando um número tem representação infinita, ele deve ser, de alguma forma, colocado em forma finita. Duas maneiras comuns de se fazer isso é chopping, quando se simplesmente corta os dígitos a mais, ou arredondamento. A representação de em ponto flutuante é denotada por .
O infinito é representado quando todos os valores do expoente são 1. OS valores de NaN (QNaN e SNaN) variam a mantissa e mantém os expoentes todos 1.
Um ponto interessante é a densidade dos números ponto flutuante. Quanto maior fica o número, menor a densidade. Isso acontece porque o tamanho da mantissa é fixo, então sempre vão existir números representados para cada expoente. Assim o intervalo tem número fixo de números que independe de , apesar da distância crescer. Por esse motivo também, é o epsilon no sistema 64-bit.
Representação ponto flutuante
Vamos mostrar um exemplo de como transformar um número real em um ponto flutuante.
- Separar parte inteira da parte decimal.
- Transformar a parte inteira e a parte fracionária em sua representação binária.
- Deixar o número no formato .
- Adicionar o viés 1023 ao expoente.
- Converter o expoente em binário.
- Casa 53: se for 1, soma-se a casa 52.
Para conferir, você pode verificar a representação utilizando alguma linguagem de programação. Por exemplo, em Python, ```{python}
import struct def binary(num): s = struct.pack('!d', num) # packs the num to the decimal format s = struct.unpack('!Q', s)[0] # unpacks in long integer format. s = bin(s) # converts to binary form. s = s[2:].zfill(64) # fills with zeros until reaches length 64. return s[0] + ' ' + s[1:12] + ' ' + s[12:]
binary(1/2) '0 01111111110 0000000000000000000000000000000000000000000000000000'
binary(1/7) '0 01111111100 0010010010010010010010010010010010010010010010010010' ```
Mensuração de erros
Seja uma aproximação para . Dizemos que o erro absoluto é e o erro relativo é quando . Dizemos que aproxima em dígitos significativos se
Algumas dicas com Python
- Para printar todos os números da representação numérica (considerando arredondamento) em Python, use
```{python}
import numpy format(numpy.pi, .20) '3.141592653589793116' ```
- Para verificar o valor exatamente armazenado para o número em questão:
```{python}
from decimal import Decimal Decimal.from_float(0.1) Decimal('0.1000000000000000055511151231257827021181583404541015625') ```
Para mais detalhes, consulte o material adicional