So schrieb ich zwei Funktionen zur Berechnung natürlichen Logarithmus der Variable x, nach Erhöhung der oberen Grenze der inkrementellen Summe auf 33000 die Funktionen immer noch ungenau Ergebnisse in ghci getestet, verglichen mit dem Standardprotokoll Funktion von Prelude importiert, hier ist die Code Definition:Natural Logarithmus mit der Serie in Haskell gibt ungenaue Ergebnisse
lnOfx :: Float -> Float
lnOfx x = netSum f 1 33000
where f i = 2*(1/oddTerm)*((x-1)/(x+1))**oddTerm
where oddTerm = 2*i-1
netSum f minB maxB = sum [f i | i <- [minB .. maxB]]
lnOfx2 :: Float -> Float
lnOfx2 x = netSum f 1 33000
where f i = (1/i)*((x-1)/x)**i
netSum f minB maxB = sum [f i | i <- [minB .. maxB]]
und die Testergebnisse:
log 3
1.0986122886681098
lnOfx 3
1.0986125
lnOfx2 3
1.0986122
log 2
0.6931471805599453
lnOfx 2
0.6931472
lnOfx2 2
0.6931473
Also, warum die Ergebnisse unterscheiden und was ist der richtige Weg (wie die Log-Funktion von Prelude tut) zu berechnen den natürlichen Logarithmus richtig?
(1) Gleitkommaarithmetik ist von Natur aus ungenau. (2) Ein Teil der Ungenauigkeit in Ihren Funktionen entsteht nur, weil Sie "Float" anstatt "Double" verwenden. – duplode
@ duplode danke für die Antwort. Es ist in der Tat genauer, aber nachdem ich die Funktionen geändert habe, geben Sie die Signatur von Float nach Double ein und vergleichen Sie dann mit Prelude Log. Die letzten Ziffern unterscheiden sich immer noch erheblich. –