0

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

2 回答 2

1

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

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

以不同的顺序添加这些近似值将给出不同的近似值。

于 2015-03-05T16:30:01.433 回答
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 示例中看到的那样。

于 2015-03-06T11:43:14.673 回答