当我做浮点加法时,得到了不同的结果。我的数据库是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发布于 2015-03-05 16:30:01
但是您使用的是32位浮点数的全部精度。请记住,这些是二进制浮点值,而不是十进制。当你在十进制中查看它时,你会得到一堆尾随的零,它看起来非常漂亮和干净。但是,如果要以二进制方式查看这些值,就会看到一堆值落后于右边。二进制数中的值与您在十进制中看到的值并不完全相同。
在基数10中,在32位二进制中,大约等于10.01110011001100110011001100110011001100。(这些值可能不完全正确,但它给出了正确的想法。)以小数表示的二进制数是2.449999988079071044921875,它四舍五入为2.450000。
将这些近似按不同的顺序相加,就会得到不同的近似。
发布于 2015-03-06 11:43:14
各种数字的FP表示(以及不准确的程度)都将由IEEE754 FP标准控制。
通过使用http://www.h-schmidt.net/FloatConverter/IEEE754.html上的工具,您可以看到任何FP值的二进制表示。
例如,2.45的符号位0指数编码为128 (减去127后计算,因此有效地是1)尾数编码为1887437 (约为1.225000023841858)。
正如你所看到的那样,它有点太大了(因为尾数加倍会给出比我们试图表示的2.45稍大的东西)。
您可以将其他值放入该工具中,以找到IEEE754所需的表示。
不准确传播到结果中的原因将是数字求和的顺序,就像我们在好方法/坏方法示例中看到的那样。
https://stackoverflow.com/questions/28882629
复制相似问题