浮点数关联错误

时间:2015-03-05 16:21:02

标签: sql floating-point floating-accuracy floating-point-precision kognitio-wx2

当我进行浮点加法时,我会得到不同的结果。我的数据库是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

2 个答案:

答案 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示例中看到的那样。