zhilve 发表于 2012-9-11 14:29:26

睁开您的火眼金睛,请问我的代码两种表达方式逻辑上有...

本帖最后由 zhilve 于 2012-9-11 14:52 编辑

/******************************************************************************/
代码一
        if ((InputI<MinI)||(InputI>MaxI))
        {
                InputI = MinI;
        }
/******************************************************************************/
代码二
        if ((InputI>MinI)&&(InputI<MaxI))
        {
        }
        else
        {
                InputI = MinI;
        }
/******************************************************************************/
我在工程中,经测试发现代码一,溢出了,代码二得到了想要的结果,我想请问,代码一和二在逻辑上有什么不同吗

longwu537 发表于 2012-9-11 14:36:10

没看出来……

zb05022005 发表于 2012-9-11 14:37:52

没看出问题
具体是哪里溢出?

zhilve 发表于 2012-9-11 14:51:32

代码一,会出现InputV在数码管显示0的现象

newhz 发表于 2012-9-11 14:55:01

代码一
当InputI<MinI就执行了,后面的条件可以不用执行

zb05022005 发表于 2012-9-11 14:55:06

调试一下代码一,看看有没有执行进去

jpchen 发表于 2012-9-11 15:02:34

代码1和代码2逻辑稍有区别,就是InputI=MinI或者InputI=MaxI时。
在代码2正确的前提下,你将代码1的条件判断里改成<=和>=,这样2段代码就完全一样了。

Alvin007 发表于 2012-9-11 15:17:11

同意楼上

ahuang227 发表于 2012-9-11 15:31:57

同意。。

gao_hailong 发表于 2012-9-11 15:44:32

先看下你的数据类型定义,然后检查下两者的汇编代码有什么区别

afengjiuling 发表于 2012-9-11 18:16:59

这两个if条件并不是互补的呀,所以结果当然不一样

adongliu 发表于 2012-9-11 18:30:35

同意5楼的意见

brahen 发表于 2012-9-11 18:37:41

jpchen 发表于 2012-9-11 15:02 static/image/common/back.gif
代码1和代码2逻辑稍有区别,就是InputI=MinI或者InputI=MaxI时。
在代码2正确的前提下,你将代码1的条件判 ...

同意
补充字数

lvhoujun 发表于 2012-9-11 21:54:47

zhilve 发表于 2012-9-13 17:14:37

经测试 改代码为
                if ((InputV>=MinV)&&(InputV<=MaxV))
                {
               
                }
                else
                {
                        InputV = MinV;
                }
                if ((InputI>=MinI)&&(InputI<=MaxI))
                {
                }
                else
                {
                        InputI = MinI;
                }
还是和代码一有差别。代码一执行后,数码管有可能显示为0,限制条件没有生效
而上面的代码能起限制作用,求解释

chinmel 发表于 2012-9-13 17:33:24

需要知道InputV这个变量的类型。是unsigned还是signed?
MinV呢

chinmel 发表于 2012-9-13 17:34:58

当InputV是unsigned,若程序意外使得InputV为负数,那么InputV的数值将反转为正数。因为unsigned是8位存储的。

zhilve 发表于 2012-9-14 08:42:40

inputV和inputI 都是浮点 MinI和MinV是宏定义

fjourdev 发表于 2012-9-14 08:59:12

实际最好办法就是单步仿真下,看看每步跟自己理解是否相同,如有不同在去体会这代码为什么会这样执行!就可以了!{:smile:}

lmt50211 发表于 2012-9-15 12:10:46

代码1是两个条件只要有一个成立就执行;代码2是两个条件同时成立才执行;

冰雪王爵 发表于 2012-9-15 12:46:06

t3486784401 发表于 2012-9-17 10:11:48

zhilve 发表于 2012-9-14 08:42 static/image/common/back.gif
inputV和inputI 都是浮点 MinI和MinV是宏定义

比较浮点数的临界值,本来就容易出问题吧:

1. 浮点数的舍入误差可能造成 x.999999被舍弃成 x 而不是进位成 (x+1)

2. 判定浮点数间的 > 和 >= 关系的区别,很容易因为舍入误差而把等号干掉吧

建议在此步放弃浮点,建议使用 x10 x100... 之类办法把浮点数转成整形数再处理

zhilve 发表于 2012-11-10 08:44:23

楼上的方法不失为一个好方法。从代码层面切实很难发现问题。

dudududu 发表于 2012-11-10 09:16:20

感觉是数据类型不合适

zhilve 发表于 2012-11-19 15:49:16

找出原因了 ,浮点数,除了一般数值,还存在,无穷大,无穷小,不存在(NaN),我的例子是读取EEPROM的值,如果不在范围内就要进行最小值或者最大值的重新赋值。如果读取失败 读取的应该是 FFFFFFFF FFFFFFFF FFFFFFFF,这样这个数就是NaN了,所以在后面的判断中出现了不可预料的情况。在此还是要谢谢以上各位的热心帮助

ccstc 发表于 2012-11-19 16:02:00

谢谢楼主分享问题原因
{:loveliness:}

longwu537 发表于 2012-11-19 16:11:11

又学习到了,谢楼主分享经验

shin555 发表于 2012-11-20 17:33:35

不错,之前也遇见过关于float的相关问题,mark
页: [1]
查看完整版本: 睁开您的火眼金睛,请问我的代码两种表达方式逻辑上有...