关于内核中的乘法和除法。

作者:heziq 发布于:2015-5-6 22:02

前几天一直在看wowo的时间子系统,一直在思索mult和shift变量,为什么mult要尽量大,shift尽量小。这是由c语言的整数算术运算决定的。

cyn* mult > shift  在不考虑溢出的情况下,cyn * mult没有误差,右移shift有误差,损失小数。

但是如果cyn > shift * mult 在不考虑溢出的情况下,误差就会被放大。

10* 12 / 8 = 15

10 / 8 * 12 = 12

10 除以 8 = 1, 舍弃0.25 , 0.25 * 12 = 3. 可以看出乘法部分的误差被夸大12倍。

mult / shift 的比值越大越好,计算的值越精确。shift如果是1,就没有误差,如果shift是10,那么就只能精确到十位。

 

表达不好哈,不善于利用数学公式证明。我说的都是整数运算,不考虑浮点数。

 

总结两点:

内核中做运算

1,尽量做加减法,少做乘除法,尽量用移位做乘除法。这样运算速度快。

2,做乘除法的时候,先算乘法,最后做除法,乘法的时候注意溢出。

3,在特殊的情况下,被除数和除数的比值要尽量大,这样计算误差才会小。

评论:

schedule
2015-05-10 14:28
GOOD

发表评论:

Copyright @ 2013-2015 蜗窝科技 All rights reserved. Powered by emlog