4

所以我在谷歌上搜索了很长时间,我几乎一无所获。我从这个 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

太不准确了...

我在想它就像一个系列的总和,但我不确定。

4

1 回答 1

7

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

加快进程

如果您还需要处理负碱基的生根,请参见:

于 2013-09-28T22:39:54.177 回答