浮点部门的软件实施,四舍五入问题

Software implementation of floating point division, issues with rounding

本文关键字:四舍五入 问题 软件 点部      更新时间:2023-10-16

作为一个学习项目,我正在使用C 在软件中实现浮点操作(add,sub,mul,div)。目的是对浮点行为的基本细节更加满意。

我试图将处理器操作与确切的位置相匹配,这意味着IEEE 754标准。到目前为止,它的运作良好,添加,子和多次表现都很好,我对大约1.1亿个随机操作进行了测试,并获得了与处理器在硬件中所做的相同结果。(尽管没有考虑到边缘案例,溢出等)。

之后,我开始转到最后一个操作,分区。它运行良好并实现了想要的结果,但是不时,我遇到了最后一个曼蒂萨(Mantissa)的错误,而不是四舍五入。我很难理解原因。我一直在使用的主要参考是 John Farrier 的出色演讲(时间戳记是在显示如何回合的点):

https://youtu.be/k12bjgsc2nc?t=1153

,对于所有操作来说,四舍五入的运行状况都非常好,但为该部门给我带来了麻烦。让我给你一个具体的例子。我正在尝试将645.68011474609375划分为493.20962524414063

我得到的最终结果是:

矿山:0-0111111-0100111111100100011110000 0

C _:0-0111111-0100111111111111111111111111111111111111111111111111> 1

您可以看到所有匹配的一切,除了最后一位。我计算该部门的方式是基于此视频:https://www.youtube.com/watch?v=fi8a4zz1d-s

之后,我计算了24位Mantissa的准确性24(隐藏的一 23 Mantissa)和3位用于后卫,圆形粘性,再加上一个额外的一个,以进行可能的换档。使用视频的算法,我可以最大程度地获得1个归一化偏移,这就是为什么在归一化中会变化时,我最终会额外添加一点,因此可以在舍入。现在,这是我从分区算法中获得的结果:

 010100111100100011110000 0100
 ------------------------ ----
 ^                        grs^
 |__ to be normalized        |____ extra bit

您可以看到我在第24位的位置上获得0,因此我需要在左边移动以获得正确的归一化。这意味着我会得到:

10100111100100011110000 100

基于约翰·法里尔(John Farrier)的视频,在> 100 grs bits的情况下,我只有在Mantissa的LSB为A时才归一化。我没有结束我的结果。

我有点迷路的原因是我确定我的算法是计算正确的曼蒂萨(Mantissa),我已经通过在线计算器对其进行了仔细检查,该舍入策略适用于所有其他操作。同样,以这种方式计算,触发标准化,最终产生正确的指数。

我想念什么吗?一个小细节?

让我奇怪的一件事是粘性碎片,在加法和乘法中,您得到了不同程度的转移,这会导致粘性碎片的更高机会触发,在这种情况下,我只转移一个最大的粘性位并不是真的很粘。

我确实希望我提供足够的细节以使我的问题理解。在这里,您可以在底部找到我的部门实现,有点充满了我用于调试的打印件,但应该对我正在做的事情进行了解,代码从第374行开始:

开始。

https://gist.github.com/giordi91/1388504fadcf94b3f6f42103dfd1f938

ps:与此同时,我正在浏览"科学家应该知道有关浮点数的一切",以查看我是否错过了任何东西。

您从分区算法获得的结果不足。您显示:

 010100111100100011110000 0100
 ------------------------ ----
 ^                        grs^
 |__ to be normalized        |____ extra bit

数学上精确的商继续:

 010100111100100011110000 0100 110000111100100100011110…

因此,在您要舍入的点上的残留物超过½ULP,因此应将其舍全面。我没有详细研究您的代码,但是看来您可能刚刚计算出一两个显着的 1 。实际上,您需要知道残留物为非零,而不仅仅是其下一点是零。如果在确切的数学结果中或以上的位置上的任何的任何,则最终的粘性位应为一个。

脚注

1 " agindand"是首选术语。" Mantissa"是对数部分的遗留术语。浮点值的显着性是线性。mantissa是对数的。