Math.Pow(等等)实际上是如何工作的

所以我在Google上search了很长时间,几乎找不到任何东西。 我从这个URL中发现了一些关于Math.Pow可能实现的信息,但是它们是不准确的,例如这个代码

public static double PowerA(double a, double b) { int tmp = (int)(BitConverter.DoubleToInt64Bits(a) >> 32); int tmp2 = (int)(b * (tmp - 1072632447) + 1072632447); return BitConverter.Int64BitsToDouble(((long)tmp2) << 32); } static void Main(string[] args) { double x = 12.53, y = 16.45; Console.WriteLine(Math.Pow(x, y)); Console.WriteLine(PowerA(x, y)); } 

提供输出:

 1,15158266266297E+18 8,9966384455562E+17 

所以不准确

我在想,它是一个系列的总和,但我不知道肯定。

战俘通常用以下公式来评估:

 x^y = exp2(y*log2(x)) 

函数exp2(x),log2(x)直接在FPU中实现。 如果你想实现bignums,那么他们也可以使用预先计算的sqrt-powers表来进行评估,例如:

 2^1/2, 2^1/4, 2^1/8, 2^1/16, 2^1/32 ... 

加快这个过程