Veja minha resposta a esta pergunta para alguns problemas relacionados.
Em geral, os computadores podem apenas adicionar, subtrair, multiplicar, dividir e mudar de bits. Por uma questão de argumento, vamos supor que você não esteja calculando no caso especial em que a é uma potência de 2 eb é um número natural, porque esse caso se reduz a uma mudança de bits e, portanto, é fácil.abab
Se é um número natural e você deseja calcular a b , pode usar a exponenciação da cadeia de adição . Todos os outros casos da sua pergunta são difíceis (em geral).bab
Alguns algoritmos rápidos usados para aproximar essas funções à alta precisão requerem magia negra. Para entender o que quero dizer com "magia negra", dê uma olhada nesta publicação de Martin Ankerl e em um artigo associado ao qual ele vincula a Computação Neural . Veja também o algoritmo CORDIC .
Tipos semelhantes de truques de troca de bits são explicados em Hacker's Delight (o link está no site complementar do livro).
Outras maneiras de calcular boas aproximações usam a análise numérica (consulte o artigo da Wikipedia sobre teoria da aproximação ). Uma má maneira de fazer isso é montar uma equação diferencial apropriada e integrá-la usando um método numérico como o método de Euler (como eu disse, uma aproximação ruim, mas você pode fazê-lo). Uma maneira melhor de fazer isso é usar aproximações em série. A série Taylor converge muito lentamente, portanto, algo como um aproximado Padé ou algum outro tipo de aproximação de série de convergência rápida pode ser usado (outros aproximadores racionais, séries Chebyshev, etc.).
O algoritmo usado para aproximar as funções acima dependerá de sua arquitetura, requisitos de velocidade e requisitos de precisão.
O problema de falar sobre complexidades é que qualquer algoritmo calcula apenas uma aproximação de ponto flutuante das funções mencionadas, portanto o tempo de execução certamente dependerá da precisão exigida por sua aproximação. Mesmo levando isso em consideração, não acho que a complexidade computacional seja uma boa primeira aproximação do desempenho; o tamanho de seus insumos vai ser medido em bits (ou seja, o número de bits que é preciso para representar , b e cabc), que serão dependentes da precisão, em vez de depender das magnitudes das próprias entradas numéricas. Para fins práticos, a precisão da representação numérica dos números não varia muito (precisão única, precisão dupla, precisão quádrupla), e você normalmente não decide usar essa precisão com base em estimativas de complexidade computacional de funções escalares . A métrica mais relevante é a hora do relógio de parede e, a menos que você esteja usando uma arquitetura especial (sistemas embarcados) ou seu aplicativo exija realmente um exponencial rápido (consulte o link da postagem do blog e o link Neural Computation acima), as bibliotecas intrínsecas em seu linguagem de escolha provavelmente está bem.