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

时间:2014-05-30 10:01:35

标签: 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;
}

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

  

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(打印到控制台的值)

3 个答案:

答案 0 :(得分:5)

466056.468750f466056.468750f - 0.01f的表示形式与float相同。

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

答案 1 :(得分:4)

wtf的类型从float更改为doublefloat类型对该数字没有精确度(在Web上读取以了解差异) 希望我能帮忙!

答案 2 :(得分:2)

您的程序发生的事情是由浮点不准确引起的。如果您将float替换为double,该程序将按预期运行。