出乎意料的浮點數加法

2021-06-23 06:50:17 字數 790 閱讀 6764

無意之中使用python(2.6、2.7)計算了一串加法:

51.2 + 61.0 + 78.5 + 64.1 + 30.3 + 52.4 + 12.0 + 46.0 + 83.6

得到的結果卻是:

479.0999999999999

大吃一驚!

然後換種語言計算,使用c語言:

float sum = 51.2f + 61.0f + 78.5f + 64.1f + 30.3f + 52.4f + 12.0f + 46.0f + 83.6f;

printf("sum = %f\n", sum);

輸出結果:

sum = 479.099976

額,這個。。。

然後同樣使用c語言,但使用雙精度浮點數:

double sum = 51.2 + 61.0 + 78.5 + 64.1 + 30.3 + 52.4 + 12.0 + 46.0 + 83.6;

printf("sum = %f\n", sum);

輸出結果:

sum = 479.100000

這回看上去正確了。

由於浮點數在機器表示中是離散值,大部分小數只能是它的近似值,因此浮點數的運算存在誤差,這是不可避免的,在程式設計中不能忽略這個問題,特別是對計算精度有很高的要求的時候。

在使用高階語言程式設計時,還是盡量用雙精度或者更高精度的浮點數,單精度還是盡量不要用了吧。如有必要還需使用專門的庫。

另外,python的浮點運算有點坑。。。

出乎意料的else語句

在python中你可能時不時不碰到else語句用在while和for迴圈中,請不要驚訝,先看看它的作用吧!實際上在迴圈語句中,else子句只會在迴圈完成後執行,即跳出迴圈的操作,如break,同時也會跳過 else塊。下面是乙個來自python核心程式設計的例子 def showmaxfactor ...

出乎意料的else語句

在python中你可能時不時不碰到else語句用在while和for迴圈中,請不要吃驚,先看看它的作用吧!實際上在迴圈語句中,else子句僅僅會在迴圈完畢後執行。即跳出迴圈的操作。如break,同一時候也會跳過 else塊。以下是乙個來自python核心程式設計的樣例 def showmaxfact...

浮點數加法

include includechar input 2 1000 int n char point1 1000 point2 1000 char int1 1000 int2 1000 int pointans 1000 int intans 1000 bool pointcarry int foo...