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

问题描述 投票:0回答:1

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

0100 0010 0100 1001 0101 0011 0010 1110

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

接下来的8位是指数 - > 1000 01002 - > 8416 - > 13210.指数132 -127 = 5

Mantissa 1.1001 0010 1010 0110 0101 110(23位)

left shift my exponent => 110010.0101010011001011102 => 50.3312310

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

没有四舍五入 1.1001 0010 102左移5 => 110010.010102 => 50.312510, 误差是50.33123 - 50.3125 => 0.01873。

四舍五入 1.1001 0010 112 =>左移5 => 110010.010112 => 50.3437510, 错误是50.33123 - 50.34375 = -0.01252

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

c floating-point ieee-754 half-precision-float
1个回答
0
投票

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

Fp16 => 1.5.10fp_16中显式存储10位精度,Unit in the Last Place是一种二进制浮点格式。使用隐含位,提供float为最高位的2-10的值。 50.33123作为50.33123016357421875具有0x1.92A65Cp+5fp_16的精确值。通过舍入以最小化精度误差,与50.34375最接近的值是0x1.92Cp+51.5.10

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


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

这0.02%的差异并不出乎意料。如果不改变float a = 50.33123f; a_fp16_upper = (fp_16) a; a_fp16_lower = (fp_16) (a - a_fp16_upper); 格式,或保存下面的附加值,这种精度损失是不可避免的。

qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.