所以我在谷歌上搜索了很长时间,却什么也没发现。我从此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的预先计算表对它们进行评估,例如:
exp2(x),log2(x)
2^1/2, 2^1/4, 2^1/8, 2^1/16, 2^1/32 ...
加快流程