簡體   English   中英

浮點數關聯錯誤

[英]Floating point number association error

當我執行浮點加法運算時,會得到不同的結果。 我的數據庫是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

但是,您使用的是32位浮點數的全精度。 請記住,這些是二進制浮點值,而不是十進制。 當您以十進制查看它時,會得到一堆尾隨零,並且看起來非常干凈。 但是,如果要以二進制形式查看這些值,則會在右邊看到一堆值。 二進制中的值與十進制中的值不完全相同。

以10為底的2.45大約等於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所需的表示形式。

正如我們在“好方法” /“壞方法”示例中所看到的那樣,導致誤差傳播到結果中的原因將是求和數字的順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM