Meia precisão: Não disponível para todos!

O padrão IEEE 754:2008 define um tipo de “meia precisão”, ou seja, uma estrutura de 16 bits de tamanho com 11 bits significativos e expoente de 5 bits:

Este tipo é definido para alguns processadores (como alguns ARM), mas não está disponível para a plataforma Intel, e é conhecido como __fp16.

As limitações são óbvias… o ε é de 2^{-10} e o bias do expoente é de 15. Ou seja, o menor valor, subnormal, que pode ser especificado é de 2^{-10}\cdot2^{-14}=2^{-24} e o maior valor, normalizado, é de (2^{11}-1)\cdot2^{15-10}=65504 — O 15-10 vem do fato de considerarmos todos os bits significativos como setados e apenas como componente inteiros, é necessário deslocar o “ponto” em 10 bits para a direita.

E a quantidade de algarismos decimais significativos é de apenas 4: p_{10}=\left\lceil p_{2}\cdot\log 2\right\rceil\approx\left\lceil11\cdot0,31\right\rceil.

Ahhh… lembre-se que o expoente final da escala é calculado como E=e-bias e, portanto, o valor mínimo é E_{min}=0-15+1=-14, porque um valor subnormal é obtido com o mesmo expoente do menor valor normalizado possível (onde E=1). O expoente máximo é E_{max}=30-15=15. Os expoentes e=0 e e=31 (note o e minúsculo!) são reservados para subnormais e não-números, respectivamente (por isso E_{max} é obtido à partir de e sendo 30, e não 31 (0x1f)…

Esse tipo limitado de representação é útil em alguns casos… Em GPUs, por exemplo, o half precision floating point existe e pode ser usado para cálculos bem rápidos, desde que tenhamos certeza de obedecer a faixa de abrangência.

Anúncios