当除数尾数全为零时的浮点算法 - 例如在 2.0 英寸的情况下 - IEEE -754

Floating Point Algorithm when Divisor Mantissa is all zeros - say in the case of 2.0 in - IEEE -754

提问人: 提问时间:7/17/2020 更新时间:7/17/2020 访问量:291

问:

我需要为小型 SBC 实现一个浮点包,并且大多数例程现在都可以工作,但在测试过程中,我注意到这个 1(附件)中的算法不会(实际上不能)在除数尾数全为零的情况下产生正确答案,例如 500/2 将产生答案 255.0 而不是 250.0

01000000011111110100000000000000 = 0x43FA00  (500 base 10) and
01000000000000000000000000000000 = 0x400000  (2 base 10)

将产生

01000011011111111000000000000000 =0x437F0 (255 base 10)

有没有人对浮点算术或 FP 算法有很好的了解,可以提供帮助?

[Floating Point Division Algorithm]

算法 浮点 精度 IEEE-754

评论

0赞 7/17/2020
我已经编辑了文本以包含所有零。上面的例子取自 IEEE-7514 32 位实现,但我使用的格式是使用 80 位的旧 Z40 BCD 标准,但我认为这不是问题,问题似乎是附加算法(尾数为零)如果除数为零,则只能在商中产生 1。关于指数,我正在研究的实现对指数使用 L-128 格式,例如 7000000000 84 15 (2^-1+2^-2+2^-3+2^-4)*2^4。
1赞 Paul Hankin 7/17/2020
从图像中看不出来,但“除数”是否包括隐藏的前导位?
0赞 7/17/2020
我想知道这是否是答案?
0赞 7/17/2020
谢谢保罗,很抱歉耽搁了——我不得不带家人去散步。无论如何,是的,你要做的是首先确定结果符号,然后设置前导位“1”,这就可以让算法工作。然后,分配符号位。感谢您的帮助。
1赞 Eric Postpischil 7/17/2020
请注意,IEEE-754 使用“significand”表示浮点数的小数部分,而不是“尾数”,这是首选术语。“尾数”是对数分数部分的旧术语。有效数是线性的(加上它会增加所表示的值),而尾数是对数的(加上它会增加所表示的值)。

答:

1赞 Eric Postpischil 7/17/2020 #1

显示的图表中没有任何内容显示要使用作为浮点数有效数的主要编码的位。不应将编码某物的位与事物本身混淆。例如,普通 IEEE-754 二进制浮点数的实际有效数是一些二进制数字 1.xxx......xxx 的值为 [1, 2) 和由特定格式确定的位数。(次正常数字使用数字 0.xxx...xxx.) 当数字以交换格式编码时,xxx...xxx 位存储在主有效位字段中,前导 1 位或 0 位通过指数字段进行编码。(如果指数场不为零,并且不表示无穷大或 NaN,则前导位为 1。否则为 0。

通常,实际有效数用于算术运算,而不仅仅是初级有效数字段的位。