当我在C#中使用像Math.Pow(double x,double y)这样的幂函数或者在C ++中使用math.h pow-function时,这些函数会在恒定时间内运行吗?
我问的原因是因为我想知道表格上的“预先计算的”bézier函数(1-t)^ n * p0 + ... + t ^(n)* pN是否可以线性运行然后,时间可能比采用控制点和t作为参数的De Casteljaus算法的实现更快。
答案 0 :(得分:2)
我认为这些方法使用基于迭代的处理来获得结果,并且只有当两次迭代的值之间的差异低于给定的误差常数时才会停止。
有一些迭代方法能够非常快速地收敛到动力操作的结果......所以我认为它们几乎是恒定的时间。
这个问题有很多很好的解释: How is Math.Pow() implemented in .NET Framework?
修改强>
我在http://math.stackexchange.com找到了很多合适的材料。
这个非常有趣,因为它解释了使用人类语言计算取幂的方法:
<强>思想强>
我不是数学天才,但据我所知,所花费的时间并不是很大程度上取决于您选择的值,而是取决于您想要的精确位数。我想说的是它取决于参数,但有一个最大值。
另外,为了支持这一理论,请看一下这个算法(由Sun实现):http://pastebin.com/LDjS5mAR。没有循环,只有ifs。我认为这是因为实现它的人选择了他们想要的固定精度......然后扩展了保证精度所需的所有迭代。
例如,可以像这样轻松扩展不变迭代次数的循环:
for (int it = 0; it < 5; it++)
a *= a;
与:
相同a *= a; a *= a; a *= a; a *= a; a *= a;