Vea mi respuesta a esta pregunta para algunos problemas relacionados.
En general, las computadoras solo pueden sumar, restar, multiplicar, dividir y desplazar bits. Por el bien del argumento, vamos a suponer que usted está no calculando en el caso especial de que una es una potencia de 2 y b es un número natural, porque ese caso se reduce a un desplazamiento de bits, y es por lo tanto fácil.unasiunasi
Si es un número natural y desea calcular a b , puede usar la exponenciación de la cadena de suma . Cualquier otro caso en su pregunta es difícil (en general).siab
Algunos algoritmos rápidos utilizados para aproximar estas funciones a alta precisión requieren magia negra. Para ver a qué me refiero con "magia negra", eche un vistazo a esta publicación de blog de Martin Ankerl y un artículo asociado al que se vincula en Neural Computation . Vea también el algoritmo CORDIC .
Se explican tipos similares de trucos de cambio de bits en Hacker's Delight (el enlace está en el sitio web complementario del libro).
Otras formas de calcular buenas aproximaciones utilizan el análisis numérico (vea el artículo de Wikipedia sobre la teoría de la aproximación ). Una mala manera de hacerlo es armar una ecuación diferencial apropiada e integrarla usando un método numérico como el método de Euler (como dije, una mala aproximación, pero puedes hacerlo). Una mejor manera de hacerlo es usar aproximaciones en serie. La serie de Taylor converge demasiado lentamente, por lo que se podría utilizar en su lugar una aproximación de Padé o algún otro tipo de aproximación de serie de convergencia rápida (otros aproximantes racionales, series de Chebyshev, etc.).
El algoritmo que use para aproximar las funciones anteriores dependerá de su arquitectura, requisitos de velocidad y requisitos de precisión.
El problema al hablar de complejidades es que cualquier algoritmo solo va a calcular una aproximación de coma flotante de las funciones que menciona, por lo que el tiempo de ejecución dependerá de la precisión que exija de su aproximación. Incluso teniendo esto en cuenta, no creo que la complejidad computacional sea una buena primera aproximación del rendimiento; el tamaño de sus entradas va a ser medida en bits (es decir, el número de bits que toma para representar , b , y cabc), que dependerán de la precisión, en lugar de depender de las magnitudes de las entradas numéricas mismas. Para fines prácticos, la precisión de la representación numérica de los números no va a variar mucho (precisión simple, precisión doble, precisión cuádruple), y generalmente no decide usar esa precisión en función de las estimaciones de complejidad computacional de las funciones escalares . La métrica más relevante es el tiempo del reloj de pared, y a menos que esté utilizando una arquitectura especial (sistemas integrados) o su aplicación realmente exija un exponencial rápido (vea el enlace de la publicación del blog y el enlace de Computación Neural arriba), las bibliotecas intrínsecas en su el idioma de elección probablemente esté bien.