一尘不染

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

algorithm

所以我在谷歌上搜索了很长时间,却什么也没发现。我从此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

如此不准确…

我以为它像一系列的总和一样工作,但我不确定。


阅读 241

收藏
2020-07-28

共1个答案

一尘不染

战俘通常用以下公式计算:

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

加快流程

2020-07-28