以下代码很糟糕,但在生产情况下遇到过.这是通过做一些不那么疯狂的事情来解决的 - 但我无法弄清楚为什么价值保持不变.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(打印到控制台的值)
466056.468750f并且466056.468750f - 0.01f两者具有相同的表示形式float.
浮点数具有有限的表示.多个实数具有相同的浮点表示.浮点大致呈对数间隔,当浮点数较大时,有越来越多的实数具有相同的表示.