2012-02-27 78 views
0

ANSI C中人們如何處理浮點不準確?在這種情況下,預期結果爲4.305,但ANSI C返回0.000001?ANSI C浮點計算不準確

#include<stdio.h> 
main() 
{ 
    float _lcl1=66.3; 
    float _ucl1=76; 
    float lbl1 = 0; 
    float ubl1 = 0; 
    lbl1 = (_lcl1 - 2.5 * (_ucl1 - _lcl1)); 
    printf ("%e\n",lbl1); 
} 

4.205001e+01 

想法,我有是,這必須是一個常見的問題,所以有一個標準庫來處理這個人或這些轉換爲整數,做計算,然後將其轉換回?有人能提供一些關於成功的「實踐」策略的見解嗎?

+4

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – Mysticial 2012-02-27 17:19:49

+0

我想知道我們會在這裏看到多少次浮點問題 – Coren 2012-02-27 18:00:23

+0

人們通過使用十進制算術來處理這個比二進制浮點。這不是內置於C,所以你需要一個庫。簡而言之,二進制浮點並不是爲了滿足你的期望而設計的。 – 2012-02-27 22:16:35

回答

7

這與ANSI C無關並且與浮點運算有關。

你應該閱讀: 「什麼每臺計算機科學家應該知道關於浮點運算」 http://www.math.umd.edu/~jkolesar/mait613/floating_point_math.pdf

舉一個不足總結,浮點運算是不是魔術無限精度機制 - 這是一種近似使用小(通常爲32或64)位數來表示無限實數集的方式。它以二進制形式工作,而不是十進制形式,而二進制文件中精確表示的分數與十進制中精確表示的分數不同。舍入是一個問題,花車之間的間隔也是一個問題。

無論如何,如果您是一名正常工作的程序員,您應該閱讀上述文章。對於這個問題,遠遠超過Stack Overflow的幾段描述,而且這個主題非常重要。

+0

正如您在第3段中提到的,解決方案是使用十進制表示而不是二進制表示 – 2012-02-27 22:17:13

+0

不一定。使用打印輸出例程強制重現二進制表示的最小十進制表示可以在許多情況下工作,其他解決方案也可以。這裏有好幾篇很好的論文,並且是Knuth第2卷中的一個很好的部分。在任何情況下,我都不確定海報是在尋找一種方式來產生符合鉛筆和紙十進制計算的結果,他們對這種行爲表示困惑(並且他們還沒有說出它是什麼)。 – Perry 2012-02-27 22:20:35

+0

新鏈接:http://www.validlab.com/goldberg/paper.pdf – 2015-12-23 08:07:47