Vedi la mia risposta a questa domanda per alcuni problemi correlati.
In generale, i computer possono solo aggiungere, sottrarre, moltiplicare, dividere e spostare i bit. Per amor di discussione, supponiamo che si sta non calcolando nel caso particolare in cui una è una potenza di 2 e B è un numero naturale, perché questo caso si riduce a un cambiamento po ', ed è quindi facile.un'Bun'b
Se è un numero naturale e si desidera calcolare una b , è possibile utilizzare l' espiazione della catena di addizione . Ogni altro caso nella tua domanda è difficile (in generale).bab
Alcuni algoritmi veloci usati per approssimare queste funzioni ad alta precisione richiedono la magia nera. Per vedere cosa intendo per "magia nera", dai un'occhiata a questo post sul blog di Martin Ankerl e ad un documento associato a cui si collega in Neural Computation . Vedi anche l' algoritmo CORDIC .
Simili tipi di trucchi per capovolgere i bit sono spiegati in Hacker's Delight (il link è al sito Web associato del libro).
Altri modi per calcolare buone approssimazioni usano l'analisi numerica (vedi l'articolo di Wikipedia sulla teoria dell'approssimazione ). Un brutto modo per farlo è quello di elaborare un'equazione differenziale appropriata e integrarla usando un metodo numerico come il metodo di Eulero (come ho detto, una cattiva approssimazione, ma puoi farlo). Un modo migliore per farlo è usare approssimazioni in serie. La serie di Taylor converge troppo lentamente, quindi si potrebbe usare qualcosa di simile a un approssimativo di Padé o qualche altro tipo di approssimazione di serie a rapida convergenza (altri approssimativi razionali, serie di Chebyshev, ecc.).
L'algoritmo utilizzato per approssimare le funzioni sopra dipende dall'architettura, dai requisiti di velocità e dai requisiti di precisione.
Il problema nel parlare di complessità è che qualsiasi algoritmo calcolerà solo un'approssimazione in virgola mobile delle funzioni menzionate, quindi il tempo di esecuzione dipenderà sicuramente dall'accuratezza richiesta dall'approssimazione. Anche tenendo conto di ciò, non penso che la complessità computazionale sia una buona prima approssimazione delle prestazioni; la dimensione dei tuoi input verrà misurata in bit (ovvero, il numero di bit necessari per rappresentare , b e cabc), che dipenderanno dalla precisione, piuttosto che dalla grandezza degli input numerici stessi. Ai fini pratici, la precisione della rappresentazione numerica dei numeri non varia molto (precisione singola, doppia precisione, precisione quadrupla) e in genere non si decide di utilizzare tale precisione in base a stime di complessità computazionale delle funzioni scalari . La metrica più rilevante è l'ora del wall-clock e, a meno che tu non stia utilizzando un'architettura speciale (sistemi incorporati) o la tua applicazione richieda davvero un esponenziale veloce (vedi il link del post sul blog e il link di calcolo neurale sopra), le librerie intrinseche nel tuo la lingua prescelta va probabilmente bene.