簡體   English   中英

浮點變量在C中不會減少-無限while循環

[英]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.468750f466056.468750f - 0.01f都具有與float相同的表示形式。

浮點數具有有限的表示形式。 多個實數具有相同的浮點表示形式。 浮點數大致以對數形式隔開,並且當浮點數較大時,越來越多的實數具有相同的表示形式。

wtf的類型從float更改為double float類型對於該數字沒有精度(請在網上閱讀以了解差異),希望我能幫上忙!

您的程序所發生的事情是由浮點錯誤引起的。 如您所願,如果你更換計划將努力floatdouble

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM