用c语言编写了一个物理(monte carlo自旋磁场)模拟程序,遇到了一个奇怪的问题。
if语句只适用于一个变量的特定值。我想做的是,我有一个变量(bh,外部磁场),它有一个特定的初始值。我继续减少它,直到它在10步内到达-bh,然后它应该开始增加,直到它再次到达+bh,以此类推,直到迭代结束。
这对bh=.3很好,但如果设置为.1、.2或1,则不起作用。它开始减少,但直到模拟结束才停止。我的程序中没有其他值等于.3!
我不知道应该包括什么,因为主程序有点长。但代码片段是(没有主循环,但包括调试回声):

 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。我做错了什么?

最佳答案

if (bh == bmax) { bup=1; }

使用==比较浮点数通常会由于舍入而导致结果与预期不符。
EPSILON定义为一些合理的小值,并比较如下浮点数:
if (fabs(bh - bmax) < EPSILON)

关于c - if语句仅适用于某些值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17479658/

10-08 23:42