浮点数关联错误

Floating point number association error

当我进行浮点加法时,我得到了不同的结果。我的数据库是 32 位 Kognitio。当我的浮点值完全在限制范围内时,有人能更好地解释为什么这是一个问题吗?

我明白,由于近似和舍入误差,涉及浮点数的运算并不总是关联的。但就我而言,我没有使用存储的完整精度。

以下是我使用简单的 select

进行的试验
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

但是您使用的是 32 位浮点数的全精度。请记住,这些是二进制浮点值,而不是十进制。当你以十进制查看它时,你会得到一堆尾随零,它看起来非常漂亮干净。但是,如果您以二进制形式查看这些值,您会看到右侧尾部有一堆值。二进制值与您看到的十进制值并不完全相同。

2.45 以 10 为基数约等于 32 位二进制的 10.011100110011001100110011001100。 (这些值可能不完全正确,但它给出了正确的想法。)精确呈现为十进制的二进制数是 2.449999988079071044921875,四舍五入为 2.450000。

以不同的顺序添加这些近似值会得到不同的近似值。

各种数字的 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 示例中看到的那样。