[英]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.