关于内核中的乘法和除法。
前几天一直在看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,在特殊的情况下,被除数和除数的比值要尽量大,这样计算误差才会小。
继续讨论
新讨论请用 GitHub 账号在下方发言——评论会保存在本仓库的 Discussions 里,与站点同寿; 再下方的「历史评论」是原站的只读存档。
评论(1 条,只读存档)
以下为原站的历史评论(只读存档);继续讨论请用上方的评论区。

schedule