当我进行浮点加法时,我会得到不同的结果。我的数据库是32位Kognitio。当我的浮点值在极限范围内时,有人可以更好地解释为什么这是一个问题。
我确实理解由于近似和舍入误差,涉及浮点数的操作并不总是关联的。但就我而言,我还没有使用完整的存储精度。
以下是我使用简单选择的试验
Good Way!!
2.45000000000000e+000
+ 2.45000000000000e+000
+ 2.45000000000000e+000
+ 2.45000000000000e+000
+ 2.45000000000000e+000
+ 2.45000000000000e+000
+ 4.90000000000000e+000
+ -9.80000000000000e+000
+ -9.80000000000000e+000
--------------------------
0.00000000000000e+000
Bad Way??
-9.80000000000000e+000
+ -9.80000000000000e+000
+ 2.45000000000000e+000
+ 2.45000000000000e+000
+ 2.45000000000000e+000
+ 2.45000000000000e+000
+ 2.45000000000000e+000
+ 2.45000000000000e+000
+ 4.90000000000000e+000
--------------------------
-3.55271367880050e-015
答案 0 :(得分:1)
但是您使用的是32位浮点数的全精度。请记住,这些是二进制浮点值,而不是十进制。当你以十进制查看它时,你得到一堆尾随零,它看起来非常漂亮和干净。但是如果您要以二进制形式查看这些值,您会看到一堆向右移动的值。二进制中的值与您在十进制中看到的值不完全相同。
基数10中的2.45大约等于32位二进制中的10.011100110011001100110011001100。 (这些值可能不完全正确,但它给出了正确的想法。)以十进制精确呈现的二进制数是2.449999988079071044921875,其四舍五入为2.450000。在不同的顺序中添加这些近似值会给出不同的近似值。
答案 1 :(得分:0)
各种数字的FP表示(以及因此不准确的程度)都将由IEEE754 FP标准控制。
您可以使用http://www.h-schmidt.net/FloatConverter/IEEE754.html
中的工具查看任何FP值的二进制表示例如,2.45有 标志位0 指数编码为128(在减去127后进行评估,因此实际上是1) 尾数编码为1887437(约为1.225000023841858)
正如你所看到的那样,它的分数太大了(因为尾数值加倍会比我们试图表示的2.45略大一些)。
您可以将其他值放入该工具中以查找IEEE754所需的表示。
传播到结果中的不准确的原因将是数字总和的顺序,正如我们在Good Way / Bad Way示例中看到的那样。