[AVR单片机] 没事来看看的朋友请进!!

[复制链接]
 楼主| rainning 发表于 2008-4-21 15:22 | 显示全部楼层 |阅读模式
我用的是mega64写的程序,可我遇到了一个太奇怪的问题,从没遇到过的,请看下面这几条语句:

void Cal_real_val(unsigned a)
{
   float  t1low,t1high,t3low,t3high;
    
     t1low=T1_low[a];
     t1high=T1_hig[a];
     t3low=T3_low[a];
     t3high=T3_hig[a];
    
          Ax=10000*(t1high/(t1high+t1low)-0.5)/0.125;
     
       Ay=10000*(t3high/(t3high+t3low)-0.5)/0.125;

}

这里的Ax Ay也是float变量,且为全局变量.从上面的式子可以看出:这里的Ax,Ay要想等于0则要t1low=t1high,t3low=t3high;可当有Ax=0或Ay=0时
t1low!=t1high,t3low!=t3high我实在是搞不懂这是什么原因,希望知道的朋友请告诉我!多谢!
     
 楼主| rainning 发表于 2008-4-21 15:23 | 显示全部楼层

忘了说我用的是ICC编译器!!

忘了说我用的是ICC编译器!!
t.jm 发表于 2008-4-21 17:16 | 显示全部楼层

这在浮点数里很正常.

由于精度原因,t1high/(t1high+t1low)是0.49999999或是0.50000001都会导致运算结果是0.
 楼主| rainning 发表于 2008-4-21 17:32 | 显示全部楼层

我在公式前面是*10000了!

我在公式前面是先*10000了!不是你说的问题了!
mohanwei 发表于 2008-4-21 19:09 | 显示全部楼层

一定要强制转换。还有,最好不要出现“unsigned a”的写法

t.jm 发表于 2008-4-21 19:27 | 显示全部楼层

我在GCC里试了试。

象100.00000/(100.00000+100.00001)结果就是0.5

 楼主| rainning 发表于 2008-4-23 11:14 | 显示全部楼层

我的问题解决了!!

谢谢各位朋友,出现0值时我用算可并不是0,刚才换了个编译器就没有这个问题了,看来是不是ICC编译器不好用啊!我现在用的是codevision
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

20

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部