# Épsilon de máquina

Em aritmética de ponto flutuante, denomina-se épsilon da máquina o menor número que somado a 1 produza resultado diferente de 1, ou seja, que não é arredondado. O épsilon de máquina representa a exatidão relativa da aritmética do computador, e a sua existência é uma consequência direta da precisão finita da aritmética de ponto flutuante. O valor também é chamado de unidade de arredondamento ou menor número representável, e é simbolizado pela letra grega épsilon $\epsilon$.

## Definição formal

Arredondamento é o processo de escolha da representação de um número real em um sistema numérico de ponto flutuante. Para um determinado sistema numérico e um procedimento de arredondamento, o épsilon de máquina é o máximo erro relativo do procedimento escolhido.
Algumas explicações são necessárias para se determinar o valor dessa definição. Um sistema numérico de ponto flutuante é caracterizado por uma base $b$, e por uma precisão $p$, por exemplo, o número de dígitos na base $b$ da mantissa (incluindo qualquer bit implícito). Todos os números com o mesmo expoente $e$ têm o espaçamento $b^{e-(p-1)}$. O espaçamento muda nos números que são potências perfeitas de $b$; o espaçamento no lado de maior magnitude é $b$ vezes maior que o espaçamento no lado de menor magnitude.
Uma vez que o épsilon de máquina é o limite do erro relativo, é suficiente considerar números com expoente $e=0$. Também é suficiente para considerar números positivos. Para o método de arredondamento do valor mais próximo, o erro absoluto de arredondamento é no máximo metade do espaçamento, ou $b^{-(p-1)}/2$. Este valor é o maior numerador possível para o erro relativo. O denominador no erro relativo é o número sendo arredondado, que deve ser o menor possível para tornar o erro maior. O maior erro relativo, portanto, acontece quando o arredondamento é aplicado a números na forma $1+a$ onde $a$ está entre $0$ e $b^{-(p-1)}/2$. Todos esses números arredondam para $1$ com erro relativo $a/(1+a)$. O máximo ocorre quando $a$ está no limite superior do intervalo. O $1+a$ no denominador tem pouca importância, sendo deixado de fora por conveniência, e apenas $b^{-(p-1)}/2$ é tomado com o épsilon de máquina. Como foi mostrado aqui, o erro relativo é maior para números que são arredondados para $1$, então o épsilon de máquina também é chamado de unidade de arredondamento, significando simplesmente "o máximo erro que pode ocorrer quando se arredonda para o valor unitário".
Assim, o máximo espaçamento entre um número normalizado em ponto flutuante $x$, e um número normalizado adjacente é $2\epsilon$ x $|x|$.

## Modelo aritmético

A análise numérica usa o épsilon de máquina para estudar os efeitos dos erros de arredondamento. Os reais erros da aritmética computacional são complexos demais para serem diretamente estudados, então, em vez disso, o seguinte modelo simplificado é utilizado. O padrão aritmético da IEEE define que todas as operações de ponto flutuante são feitas como se fosse possível executá-las com precisão infinita, e então o resultado é arredondado para um número de ponto flutuante. Suponha que (1) $x$ e $y$ são números de ponto flutuante, que (2) $\bullet$ é uma operação aritmética em ponto flutuante como adição ou multiplicação, e que (3) $\circ$ é a operação de precisão infinita. De acordo com o padrão, o computador calcula:
    $x\bullet y={\mbox{round}}(x\circ y)$
Pela definição, o erro relativo do arredondamento é máximo quando igual ao épsilon da máquina, então:
    $x\bullet y=(x\circ y)(1+z)$
onde $z$ em grandeza absoluta é no máximo $\epsilon$.

## Como determinar o épsilon de máquina

Os valores de épsilon de máquina a seguir se aplicam a formatos padronizados de ponto flutuante:
| IEEE 754 - 2008 | Nome usual | Tipo de dado em C++ | Base $b$ | Precisão $p$ | Épsilon de máquina $b^{-(p-1)}/2$ | Épsilon de máquina $b^{-(p-1)}$ |
| binary16 | meia precisão | indisponível | 2 | 11 (um bit implícito) | 2$^{-11}$ = 4.88e-04 | 2$^{-10}$ = 9.77e-04 |
| binary32 | precisão singular | float | 2 | 24 (um bit implícito) | 2$^{-24}$ = 5.96e-08 | 2$^{-23}$ = 1.19e-07 |
| binary64 | precisão dupla | double | 2 | 53 (um bit implícito) | 2$^{-53}$ = 1.11e-16 | 2$^{-52}$ = 2.22e-16 |
| binary80 | precisão estendida | _float80 | 2 | 64 | 2$^{-64}$ = 5.42e-20 | 2$^{-63}$ = 1.08e-19 |
| binary128 | precisão quádrupla | _float128 | 2 | 113 (um bit implícito) | 2$^{-113}$ = 9.63e-35 | 2$^{-112}$ = 1.93e-34 |
| decimal32 | precisão singular decimal | _Decimal32 | 10 | 7 | 5 × 10$^{-7}$ | 10$^{−6}$ |
| decimal64 | precisão dupla decimal | _Decimal64 | 10 | 16 | 5 × 10$^{-16}$ | 10$^{−15}$ |
| decimal128 | precisão quádrupla decimal | _Decimal128 | 10 | 34 | 5 × 10$^{-34}$ | 10$^{−33}$ |
$^a$ de acordo com Prof. Demmel, LAPACK, Scilab $^b$ de acordo com Prof. Higham; Padrão ISO C; constantes de linguagem C, C++ e Python; Mathematica, MATLAB e Octave
O épsilon de máquina de um sistema pode ser aproximado (a um fator de 2) pelo seguinte algoritmo em pseudocódigo:

## Cancelamento catastrófico

O cancelamento catastrófico é um efeito que ocorre quando excedemos o limite de precisão do sistema de numeração, sendo caracterizado por um aumento substancial do erro relativo dos resultados. O exemplo característico desse tipo de erro é quando o resultado da subtração de dois números se aproxima do valor do épsilon de máquina.

## Veja também

* Ponto flutuante, discussão geral sobre precisão em aritmética de ponto flutuante
* Propagação de erros