浮点数关联错误
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 示例中看到的那样。
当我进行浮点加法时,我得到了不同的结果。我的数据库是 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 示例中看到的那样。