Как на самом деле работает Math.Pow (и так далее)

Я долго гуглил и почти ничего не нашел. Я нашел некоторую информацию о возможной реализации Math.Pow из этого URL, но они неточны, например, этот код

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 ответ

Решение

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

ускорить процесс

Другие вопросы по тегам