为什么没有Math.Pow将int作为指数?

时间:2011-08-02 21:44:47

标签: c# .net performance math

我读到Math.Pow实现非常复杂,能够处理分数幂。当你不需要分数幂时,为什么没有一个版本为指数制作一个更快的版本?

4 个答案:

答案 0 :(得分:6)

因为你只需要将它转换回浮点数,然后将它与基数的对数相乘。

n m = e m×ln n

答案 1 :(得分:1)

对于编译器,如果指数是常数,则仅通过转换为一系列乘法来进行优化是值得的。在这种情况下,您可以自己编写x*xx*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;
}