2020-01-30 14:15发布
清雨影 发表于 2013-2-19 13:03 姐姐,你原来是香港的啊……怪不得繁体字加粤字。 关于POW,本身是针对单精度(Keil里面)浮点数运算的函数 ...
mbass51 发表于 2013-2-20 09:40 請問如何可以克服呢?
最多设置5个标签!
姐姐,你原来是香港的啊……怪不得繁体字加粤字。
关于POW,本身是针对单精度(Keil里面)浮点数运算的函数,会有第7位的舍入误差。
比如,1.999999其实就是2,第七位有效数字是不确定的,也就是说.
只有第六位是固定的。没办法,精度就是这样,只能允许6位有效数字。
第七位只有在数据满足一定条件的情况下是有效的,这个就不要去想了。
------------------------------
话说回来,为什么你的误差会出现在第四位,是你C语言没学好。
pow在keil里的原形:extern float pow (float x, float y);
i=(pow(10,4));等于i=(u32)pow(10,4);
pow(10,4)=9999.998(那个8是第七位,做不得准)
(u32)9999.998=9999(转换为int类型时丢掉小数)
所以误差就放大了。所以要四舍五入。
請問如何可以克服呢?
那就是四舍五入了。在数字绝对值小于等于999999的时候这一招非常有效。
但是C语言里没有round函数。
提供代码如下:
#define TR_INT unsigned long int
TR_INT round(float x){
return((TR_INT)(x+0.5));
}
修改TR_INT后面的类型以得到不同类型的返回值。
i=(pow(10,4));修改为
i=round(pow(10,4));
即可。
一周热门 更多>