睁开您的火眼金睛,请问我的代码两种表达方式逻辑上有...
本帖最后由 zhilve 于 2012-9-11 14:52 编辑/******************************************************************************/
代码一
if ((InputI<MinI)||(InputI>MaxI))
{
InputI = MinI;
}
/******************************************************************************/
代码二
if ((InputI>MinI)&&(InputI<MaxI))
{
}
else
{
InputI = MinI;
}
/******************************************************************************/
我在工程中,经测试发现代码一,溢出了,代码二得到了想要的结果,我想请问,代码一和二在逻辑上有什么不同吗
没看出来…… 没看出问题
具体是哪里溢出? 代码一,会出现InputV在数码管显示0的现象 代码一
当InputI<MinI就执行了,后面的条件可以不用执行 调试一下代码一,看看有没有执行进去 代码1和代码2逻辑稍有区别,就是InputI=MinI或者InputI=MaxI时。
在代码2正确的前提下,你将代码1的条件判断里改成<=和>=,这样2段代码就完全一样了。 同意楼上 同意。。 先看下你的数据类型定义,然后检查下两者的汇编代码有什么区别 这两个if条件并不是互补的呀,所以结果当然不一样 同意5楼的意见 jpchen 发表于 2012-9-11 15:02 static/image/common/back.gif
代码1和代码2逻辑稍有区别,就是InputI=MinI或者InputI=MaxI时。
在代码2正确的前提下,你将代码1的条件判 ...
同意
补充字数 经测试 改代码为
if ((InputV>=MinV)&&(InputV<=MaxV))
{
}
else
{
InputV = MinV;
}
if ((InputI>=MinI)&&(InputI<=MaxI))
{
}
else
{
InputI = MinI;
}
还是和代码一有差别。代码一执行后,数码管有可能显示为0,限制条件没有生效
而上面的代码能起限制作用,求解释 需要知道InputV这个变量的类型。是unsigned还是signed?
MinV呢 当InputV是unsigned,若程序意外使得InputV为负数,那么InputV的数值将反转为正数。因为unsigned是8位存储的。 inputV和inputI 都是浮点 MinI和MinV是宏定义 实际最好办法就是单步仿真下,看看每步跟自己理解是否相同,如有不同在去体会这代码为什么会这样执行!就可以了!{:smile:} 代码1是两个条件只要有一个成立就执行;代码2是两个条件同时成立才执行; zhilve 发表于 2012-9-14 08:42 static/image/common/back.gif
inputV和inputI 都是浮点 MinI和MinV是宏定义
比较浮点数的临界值,本来就容易出问题吧:
1. 浮点数的舍入误差可能造成 x.999999被舍弃成 x 而不是进位成 (x+1)
2. 判定浮点数间的 > 和 >= 关系的区别,很容易因为舍入误差而把等号干掉吧
建议在此步放弃浮点,建议使用 x10 x100... 之类办法把浮点数转成整形数再处理 楼上的方法不失为一个好方法。从代码层面切实很难发现问题。 感觉是数据类型不合适 找出原因了 ,浮点数,除了一般数值,还存在,无穷大,无穷小,不存在(NaN),我的例子是读取EEPROM的值,如果不在范围内就要进行最小值或者最大值的重新赋值。如果读取失败 读取的应该是 FFFFFFFF FFFFFFFF FFFFFFFF,这样这个数就是NaN了,所以在后面的判断中出现了不可预料的情况。在此还是要谢谢以上各位的热心帮助 谢谢楼主分享问题原因
{:loveliness:} 又学习到了,谢楼主分享经验 不错,之前也遇见过关于float的相关问题,mark
页:
[1]