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 ...
加快这个过程