以下代码很糟糕,但在生产情况下遇到过。这是通过做一些不那么疯狂的事情来解决的 - 但我无法弄清楚为什么价值保持不变。 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(打印到控制台的值)
答案 0 :(得分:5)
466056.468750f
和466056.468750f - 0.01f
的表示形式与float
相同。
浮点数具有有限的表示。多个实数具有相同的浮点表示。浮点大致呈对数间隔,当浮点数较大时,有越来越多的实数具有相同的表示。
答案 1 :(得分:4)
将wtf
的类型从float
更改为double
。
float
类型对该数字没有精确度(在Web上读取以了解差异)
希望我能帮忙!
答案 2 :(得分:2)
您的程序发生的事情是由浮点不准确引起的。如果您将float
替换为double
,该程序将按预期运行。