我正在使用Verilog实现硬件双精度加法器。在验证阶段,当我将我的硬件输出与MATLAB(或C)双精度加法输出进行比较时,我发现了LSB不匹配的一些奇怪情况,考虑到我使用相同的舍入模式(舍入到最接近的偶数) 。我的问题是关于C计算的准确性,它是否真正准确地进行舍入或者仅限于一些CPU架构(32或64位)?
这是一个例子,
A = 0x62a5a1c59bd10037 = 1.5944933396238637e + 167
B = 0x62724bc40659bf0c = 1.685748657333889e + 166 = 0.1685748657333889e + 167
正确的输出(只需手动添加上述实数)
= 1.7630682053572526e + 167 = 0x62a7eb3e1c9c3819(这与我的硬件匹配)
当我尝试用C做A + B时,结果等于
= 1.7630682053572525e + 167 = 0x62a7eb3e1c9c3818
当我尝试此应用程序来检查中间操作时 http://www.ecs.umass.edu/ece/koren/arith/simulator/FPAdd/
我可以从尾数中看到,C没有正确地进行舍入(舍入到最近的偶数)。在这种情况下,尾数应该通过添加一个来舍入。知道为什么会这样吗?
答案 0 :(得分:0)
http://www.ecs.umass.edu/ece/koren/arith/simulator/FPAdd/的操作是正确的。最近的一轮甚至是向下舍入:
A+B + 1.0111111010110011111000011100100111000011100000011000|10 *2^555
^
|
to forget the |10 part (exactly in the middle), the result chooses 0 (even) instead of 1