浮点变量不会在C - 无限循环中递减

rka*_*ski 0 c floating-point

以下代码很糟糕,但在生产情况下遇到过.这是通过做一些不那么疯狂的事情来解决的 - 但我无法弄清楚为什么价值保持不变.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;
}
Run Code Online (Sandbox Code Playgroud)

程序运行时,产生的输出是

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
Run Code Online (Sandbox Code Playgroud)

虽然精度有明显变化,但值466056.45874999999既不是466056.469也不是466056.468750(打印到控制台的值)

oua*_*uah 5

466056.468750f并且466056.468750f - 0.01f两者具有相同的表示形式float.

浮点数具有有限的表示.多个实数具有相同的浮点表示.浮点大致呈对数间隔,当浮点数较大时,有越来越多的实数具有相同的表示.