当我在C#中使用Math.Pow(double x,double y)等幂函数或C中的math.h pow函数时,这些函数是否在恒定时间内运行?
我问的原因是因为我想知道表格(1-t)^ n * p0 … t ^(n)* pN上的“预先计算的”bézier函数是否可以在线性时间内运行,然后可能是比采用控制点和t作为参数的De Casteljaus算法更快.
最佳答案 我认为这些方法使用基于迭代的处理来获得结果,并且只有当两次迭代的值之间的差异低于给定的误差常数时才停止.
迭代方法可以非常快速地收敛到动力操作的结果……所以我认为它们几乎是恒定的时间.
这个问题有很多很好的解释:
How is Math.Pow() implemented in .NET Framework?
编辑
我在http://math.stackexchange.com找到了许多合适的材料.
> Fastest way to calculate e^x upto arbitrary number of decimals?
> How to calculate e^x with a standard calculator
> How can I calculate non-integer exponents?
> Numerically estimate a^b
> Approximation of e^(−x)
这个非常有趣,因为它解释了使用人类语言计算取幂的方法:
> How to Use a Fixed Point to Calculate an Exponentiation
思考
我不是数学天才,但据我所知,所花费的时间并不是很大程度上取决于您选择的值,而是取决于您想要的精确位数.我想说的是它取决于论点,但有一个最大值.
另外,为了支持这个理论,请看一下这个算法(由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;