Jak w C++ napisać funkcję obliczającą dowolny logarytm?

0

Witam wszystkich serdecznie.
Czy istnieje jakiś algorytm i/lub metoda na obliczenie dowolnych logarytmów?
Jak w C++ napisać taką funkcję?
Istnieje np: Algorytm obliczania pierwiastka n-tego stopnia(metoda Newtona-Raphsona), potęgę o wykładniku całkowitym też łatwo zaimplementować(wystarczy jedna pętla for).
A w jaki sposób można napisać funkcję logarytmującą lub obliczającą potęgę o wykładniku NIECAŁKOWITYM?
Wiem, że w bibliotece <math> są takie funkcje - np pow().
Chciałbym jednak nie iść na łatwiznę i samemu je napisać.
Bardzo proszę o jakieś wskazówki, przydatne wzory matematyczne, algorytmy...itp, itd.

#include <iostream>
double logarytm( double podstawa , double liczba logarytmowana)
{
??????
}

0

obliczającą potęgę o wykładniku NIECAŁKOWITYM
Pytałeś o to samo w poprzednim poście i dostałeś odpowiedź.

0

Logarytm o dowolnej podstawie a możesz łatwo obliczyć mając logarytm o znanej podstawie b:
loga(x) = logb(x) / logb(a)

Do logarytmu wykorzystaj też metodę Newtona, działa ona dla każdej funkcji ciągłej. W tym wypadku funkcją będzie f(x) = 2x - a, gdzie a to wartość logarytmowana. Da to logarytm binarny.

Edit Jeśli chcesz zrobić to wydajnie (bez cmath potęgowanie w iteracji Newtona też musisz zaimplementować jakimś sprytnym algorytmem, zapewne również Newtonem) przyjrzyj się tej publikacji: http://hal.inria.fr/docs/00/07/03/31/PDF/RR-5682.pdf

Polecam też to: http://en.wikipedia.org/wiki/Binary_logarithm#Real_number

3

Można rozwinąć funkcję w szereg Maclaurina.
Zauważmy, że ułamek w tym logarytmie może przyjmować dowolne liczby rzeczywiste dodatnie dla x ze zbioru (-1,1), co jest ważne przy zbieżności szeregu Maclaurina. Rozwijamy:

Szereg ten jest zbieżny dla x z przedziału (-1,1), co wystarczy do obliczenia dowolnego logarytmu naturalnego. Teraz rozwiązujemy równanie dla zmiennej x:

Zatem, aby policzyć ln(y) dla dowolnej liczby y>0, obliczamy najpierw zmienną pomocniczą x z powyższego wzoru, a następnie liczymy dla niej wartość szeregu Maclaurina i gotowe! ;)
Wartość logarytmu przy dowolnej podstawie obliczymy ze wzoru:

Być może metoda ta nie jest jakoś super wydajna, ale przynajmniej wiadomo skąd się wzięła. ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1