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

时间:2013-09-25 18:05:43

标签: c# .net algorithm disassembly pow

所以我谷歌搜索了很长时间,我几乎找不到任何东西。我发现了一些关于可能从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

如此不准确...

我当时认为它的作用类似于一系列,但我不确定。

1 个答案:

答案 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 ...

加快流程