Cómo funciona Math.Pow (etc.)

Así que estuve buscando en Google durante mucho tiempo y no encontré casi nada. Encontré información sobre la posible implementación de Math.Pow desde esta url , pero son inexactos, por ejemplo, este código

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)); } 

proporciona salida:

 1,15158266266297E+18 8,9966384455562E+17 

Tan inexacto …

Estaba pensando que funciona como una sum de series, pero no lo sé con certeza.

pow generalmente es evaluado por esta fórmula:

 x^y = exp2(y*log2(x)) 

Las funciones exp2(x),log2(x) se implementan directamente en FPU . Si desea implementar bignums , también pueden ser evaluados por operadores básicos con el uso de una tabla precalculada de sqrt-powers como:

 2^1/2, 2^1/4, 2^1/8, 2^1/16, 2^1/32 ... 

para acelerar el proceso