CSharp - .NET Framework的Math.Pow( ) 如何实现?

  显示原文与译文双语对照的内容

我在寻找一种有效的方法来计算 b ( 例如= 2和= ) 。 为了开始,我决定看看 Math.Pow() 函数的实现。 但是在 .NET 反射器中,我发现的是:


[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical]
public static extern double Pow(double x, double y);

当我调用 Math.Pow() 函数时,我可以看到哪些资源在里面?

时间:

passant的回答很棒,但是如果 b 是一个整数,那么 a^b 就会很好,然后用二进制分解来计算。 这是一个修改版的亨利沃伦黑客的喜悦:


public static int iexp(int a, uint b) {
 int y = 1;

 while(true) {
 if ((b & 1)!= 0) y = a*y;
 b = b>> 1;
 if (b == 0) return y;
 a *= a;
 } 
}

他指出,这个操作是最优( 最少的算术或者逻辑操作数) 所有b <15. 除了广泛的搜索之外,没有已知的解决问题的一般问题序列的已知解决方案。 这是一个NP-Hard问题,所以基本上这意味着二进制分解的效果就像。

如果免费的c版本的pow 是任何迹象,它并不像你所期望的东西。 找到. NET 版本对你来说没什么帮助,因为你正在解决的问题( 例如 。 简单的整数)的订单大小,并且可以解决在几行代码 C# 平方的乘方算法。

...