我不确定要包括什么,因为主程序有点长。但代码片段是(没有主循环,但包括调试回声):
float bh; float bmax;
bh=.3; bmax=bh;
if (bup==1) {
printf("BUP=1, BFeld = %.2f\n",bh);
bh = bh + bmax/10;
if (bh == bmax) { bup=0; }
}
if (bup==0) {
printf("BUP=0, BFeld = %.2f, %.2f = bmin\n",bh,-bmax);
bh = bh - bmax/10;
if (bh == -bmax) { bup=1; }
}
我在调试输出方面得到的是bh = .3
[...]
BUP=0, BFeld = -0.24, -0.30 = bmin
BUP=0, BFeld = -0.27, -0.30 = bmin
BUP=1, BFeld = -0.30
BUP=1, BFeld = -0.27
BUP=1, BFeld = -0.24
[...]
但是当我将bh设置为1时,我得到了
[...]
BUP=0, BFeld = -0.80, -1.00 = bmin
BUP=0, BFeld = -0.90, -1.00 = bmin
BUP=0, BFeld = -1.00, -1.00 = bmin
BUP=0, BFeld = -1.10, -1.00 = bmin
BUP=0, BFeld = -1.20, -1.00 = bmin
BUP=0, BFeld = -1.30, -1.00 = bmin
[...]
所以我的调试输出甚至给了我“...... - 1.00,-1.00 ......”的行,但不知何故c认为它们不等于“足够”将bup设置为1.我做错了什么?
答案 0 :(得分:4)
if (bh == bmax) { bup=1; }
使用==
来比较浮点数通常不会因为四舍五入而产生预期结果。
将EPSILON
定义为一个合理的小值并比较浮点数,如下所示:
if (fabs(bh - bmax) < EPSILON)
答案 1 :(得分:3)
您永远不应该使用浮点变量测试相等性。你需要在一定的容忍范围内进行测试例如:
#define EPSILON (0.000001)
if (fabs(bh - bmax) < EPSILON)
答案 2 :(得分:0)
正如其他人所说的那样,你不应该将浮点数与==
进行比较,因为该运算符会进行精确匹配。
即使你的数字看起来很简单,用十进制表示法表示(±.3,步长为±.03),当翻译成内部二进制表示od FP数字时,它们会产生无穷无尽的重复位模式(类似于重复小数点)。由于FP数量的大小有限,超出的比特要么被截断,要么被舍入,但在任何一种情况下,它们的连续累积可能会增加,这可能会引起预期数字精确表示的偏差。