[英]Floating point variable won't decrement in C - infinite while loop
以下代碼很糟糕,但是在生產環境中遇到過。 它通過做一些不那么瘋狂的事情來解決-但我不知道為什么值保持不變。 FWIW這個任意大的值是從時間戳獲取的。
#import <stdio.h>
int main(void)
{
float wtf = 466056.468750;
while(wtf > .01)
{
wtf -= .01;
/* other operations here */
printf("wtf = %f\n", wtf);
}
return 0;
}
運行程序時,產生的輸出為
wtf = 466056.468750
wtf = 466056.468750
wtf = 466056.468750
wtf = 466056.468750
wtf = 466056.468750
wtf = 466056.468750
wtf = 466056.468750
wtf = 466056.468750
wtf = 466056.468750
wtf = 466056.468750
在進行調試時,我可以看到為wtf - .01
返回了一個適當的值,但是它似乎並沒有持久。
我的問題是,為什么遞減后的值不存儲在變量中?
在gdb中,該操作的值打印如下
10 printf("wtf = %f\n", wtf);
(gdb) p wtf
$1 = 466056.469
(gdb) p wtf - .01
$2 = 466056.45874999999
(gdb) n
盡管精度有明顯變化,但值466056.45874999999既不是466056.469也不是466056.468750(打印到控制台的值)
466056.468750f
和466056.468750f - 0.01f
都具有與float
相同的表示形式。
浮點數具有有限的表示形式。 多個實數具有相同的浮點表示形式。 浮點數大致以對數形式隔開,並且當浮點數較大時,越來越多的實數具有相同的表示形式。
將wtf
的類型從float
更改為double
。 float
類型對於該數字沒有精度(請在網上閱讀以了解差異),希望我能幫上忙!
您的程序所發生的事情是由浮點錯誤引起的。 如您所願,如果你更換計划將努力float
與double
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.