關於pow的用法

2020-01-30 14:15发布

請問 i 的數值是多少?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
清雨影
1楼-- · 2020-01-30 16:51
本帖最后由 清雨影 于 2013-2-19 13:06 编辑

姐姐,你原来是香港的啊……怪不得繁体字加粤字。
关于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类型时丢掉小数)
所以误差就放大了。所以要四舍五入。
a_2012_m
2楼-- · 2020-01-30 19:35
学习了!
mbass51
3楼-- · 2020-01-30 23:52
清雨影 发表于 2013-2-19 13:03
姐姐,你原来是香港的啊……怪不得繁体字加粤字。
关于POW,本身是针对单精度(Keil里面)浮点数运算的函数 ...

請問如何可以克服呢?
清雨影
4楼-- · 2020-01-31 01:45
mbass51 发表于 2013-2-20 09:40
請問如何可以克服呢?

那就是四舍五入了。在数字绝对值小于等于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));
即可。
mbass51
5楼-- · 2020-01-31 04:02
 精彩回答 2  元偷偷看……

一周热门 更多>