我读到Math.Pow
实现非常复杂,能够处理分数幂。当你不需要分数幂时,为什么没有一个版本为指数制作一个更快的版本?
答案 0 :(得分:6)
因为你只需要将它转换回浮点数,然后将它与基数的对数相乘。
n m = e m×ln n
答案 1 :(得分:1)
对于编译器,如果指数是常数,则仅通过转换为一系列乘法来进行优化是值得的。在这种情况下,您可以自己编写x*x
或x*x*x
。
编辑:所以如果你想避免数学是由Math.Pow实现(它使用指数函数)完成的,那就不要调用它。如果将为整数添加Math.Pow,编译器将弄清楚它是如何调用的,如果它应该发出乘法代码(如果n是常数和小)或默认使用指数函数。这对于编译器来说是非常重要的工作,并且在性能方面没有任何好处。
答案 2 :(得分:0)
我不认为快速数学函数是他们编程时的首要任务(见Why is Math.DivRem so inefficient)。 他们可以使用方形的增强,更快,至少对于小指数。
然而,因为浮点受到四舍五入的影响,所以提供2种不同的补充可能意味着不同的结果,例如对于pow(5.9,7)而不是pow(5.9,7.0),这在某些情况下可能是不合需要的。
答案 3 :(得分:-3)
好吧,你可以写自己的(用C语言):
int intPow(int a,int b){
int answer = a;
int i;
for(i=0;i<b-1;i++)
answer *= a;
return answer;
}