我们如何使用FP16半精度浮点数

时间:2017-06-09 06:03:48

标签: c floating-point ieee-754 half-precision-float

我有一个例子50.33123可以以FP32(1.8.23)格式存储为0x4249532E。如果我们将其转换为二进制

0100 0010 0100 1001 0101 0011 0010 1110

第一位是符号位,0表示正数,

接下来的8位是指数 - &gt; 1000 0100 2 - &gt; 84 16 - &gt; 132 <子> 10 。指数132 -127 = 5

尾数1.1001 0010 1010 0110 0101 110(23位)

左移我的指数=&gt; 110010.010101001100101110 2 =&gt; 50.33123 <子> 10

如果我们存储相同的东西,在FP16(半精度格式)FP16 =&gt; 1.5.10:

没有四舍五入 1.1001 0010 10 2 左移5 =&gt; 110010.01010 2 =&gt; 50.3125 <子> 10
错误是50.33123 - 50.3125 =&gt; 0.01873

与舍入
1.1001 0010 11 2 =&gt;左移5 =&gt; 110010.01011 2 =&gt; 50.34375 <子> 10
错误是50.33123 - 50.34375 = -0.01252

我的问题是,错误很重要 有没有办法通过FP16实现进一步减少错误?

1 个答案:

答案 0 :(得分:0)

  

如何使用FP16半精度浮点数最小化精度误差

Fp16 => 1.5.10fp_16(二进制浮点格式)显式存储10位精度。使用隐含位,提供最高有效位Unit in the Last Place为2 -10 的值。 50.33123作为float的确切值为50.331230163574218750x1.92A65Cp+5。使用舍入来最小化精度误差,最接近fp_16的值为50.343750x1.92Cp+5

OP已完成此舍入以获得最小的错误。

  

......在这种情况下的错误是,50.33123 - 50.34375 = -0.01252
  我的问题是,这里的错误很重要。有没有办法通过FP16实现进一步减少错误?

这0.02%的差异并不出乎意料。如果不更改1.5.10格式或保存其他值,则无法避免此精度损失。

float a = 50.33123f;
a_fp16_upper = (fp_16) a;
a_fp16_lower = (fp_16) (a - a_fp16_upper);