#include<stdio.h>
#include<conio.h>
main()
{
float i=0.0;
while(i!=1.0)
{
i+=0.1;
printf("%f",i);
}
getch(
}
爲什麼它的輸出是無限的?任何人都可以告訴應該做些什麼來使這個有限?該程序的輸出是無限的。爲什麼?
#include<stdio.h>
#include<conio.h>
main()
{
float i=0.0;
while(i!=1.0)
{
i+=0.1;
printf("%f",i);
}
getch(
}
爲什麼它的輸出是無限的?任何人都可以告訴應該做些什麼來使這個有限?該程序的輸出是無限的。爲什麼?
環路是無限的,因爲下一個計算機的浮點運算,加入0.1十倍不等於1
這是因爲計算機使用二進制數做算術和數量0.1
不能被表示爲一個終止二進制數。所以計算機必須選擇一個終止的二進制數,並且適合於0.1作爲近似值的float
。不幸的是,將這個近似值加在一起的十個副本並不會產生等於1的浮點數。
如果在循環中更改格式字符串以顯示更高的精度,則可以看到值在循環i
並不確切:
0.10000000149011611938
0.20000000298023223877
0.30000001192092895508
0.40000000596046447754
0.50000000000000000000
0.60000002384185791016
0.70000004768371582031
0.80000007152557373047
0.90000009536743164062
1.00000011920928955078
一般情況下,你不應該爲相等比較浮點數。您可以使用不等式比較,通過它們的差值是否小於epsilon的某個小的固定值來檢查兩個數字是否幾乎相等,或者使用整數進行迭代,並只在需要時將其轉換爲浮點數。其他答案已經解釋了這些替代方案,所以我不會在這裏討論它們。
浮點數不準確。
因此,像平等這樣的東西早已飛離窗外。
你不能比較浮點數,因爲它們不精確。你可以在一個範圍內檢查。
#define epsilon 0.000005
main()
{
float i=0.0;
while(!(i > 1.0 - epsilon && i < 1.0 + epsilon))
{
i+=0.1;
printf("%f",i);
}
getch();
}
在要通過浮點數你應該考慮到迭代在整數和除法浮點數迭代的情況下。
你的情況:
#include<stdio.h>
main()
{
int i=0;
while(i!=10)
{
i+=1;
printf("%f",i/10.0f);
}
}
這樣,你得到最好的近似,由於加入浮點數沒有積累的舍入誤差。
嘗試'while(i <1.0)'。浮點數不準確...... darn base 2 system! –
@embedded_guy - 這是不是基地 –
得到一些零食和飲料,[**然後閱讀這**](http://docs.oracle.com/cd/E19957-01/806-3568/ ncg_goldberg.html)這有點令人生畏,但你會記得你的職業生涯的其餘部分。 – WhozCraig