浮点部门的软件实施,四舍五入问题
Software implementation of floating point division, issues with rounding
作为一个学习项目,我正在使用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是对数的。
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 使用 BMI 计算器对C++中的数字进行四舍五入的问题
- 浮点部门的软件实施,四舍五入问题
- 初学者C++:返回单个值。问题:我的金额四舍五入,我不希望它四舍五入