加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

if语句仅适用于某些值

发布时间:2020-12-16 09:46:03 所属栏目:百科 来源:网络整理
导读:我在c中编程物理(蒙特卡罗旋转磁场)模拟并遇到了一种奇怪的问题. if语句仅适用于一个变量的特定值.我试图做的是我有一个具有一定初始值的变量(bh,外部磁场).我继续减少它直到它在10步内达到-bh,然后它应该开始增加,直到它再次击中bh,依此类推,直到迭代结束.
我在c中编程物理(蒙特卡罗旋转磁场)模拟并遇到了一种奇怪的问题.
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 = %.2fn",bh);
     bh = bh + bmax/10;
     if (bh == bmax) { bup=0; }
}
if (bup==0) {
    printf("BUP=0,BFeld = %.2f,%.2f = bminn",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,BFeld = -1.00,BFeld = -1.10,BFeld = -1.20,BFeld = -1.30,-1.00 = bmin
[...]

所以我的调试输出甚至给了我“…… – 1.00,-1.00 ……”的行,但不知何故c认为它们不等于“足够”将bup设置为1.我做错了什么?

解决方法

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

使用==来比较浮点数通常不会因为舍入而导致您的预期结果.

将EPSILON定义为一些合理的小值并比较浮点数,如下所示:

if (fabs(bh - bmax) < EPSILON)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读