所以我谷歌搜索了很长时间,我几乎找不到任何东西。我发现了一些关于可能从this 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
如此不准确...
我当时认为它的作用类似于一系列,但我不确定。
答案 0 :(得分:6)
pow通常用以下公式评估:
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 ...
加快流程