Duży błąd przy liczeniu logarytmu z rozwinięcia

0

Spróbowałem sobie zaprogramować liczenie logarytmu naturalnego bez użycia sprzętowych funkcji do ich liczenia i mam dość duże błędy. Liczę z rozwinięcia w szereg i o ile wokół jedynki mam dość dobre wyniki to dla liczb trochę odbiegających od jedynki dokładność mocno spada. Robię coś źle, czy może liczenie logarytmu naturalnego w ten sposób jest z góry skazane na porażkę?

import java.math.BigInteger;
import static java.math.BigInteger.ONE;
import static java.math.BigInteger.ZERO;
import static java.math.BigInteger.valueOf;

public class Main {

    public static void main(String[] args) {
        int scale = 50;
        for (long x = 1l; x < 2l << scale; x += 1l << scale - 7) {
            System.out.printf("%f %f %f\n",
                    x / (double) (1l << scale),
                    Math.log(x / (double) (1l << scale)),
                    ln(x, scale) / (double) (1l << scale));
        }
    }

    public static long ln(long x, int scale) {
        BigInteger r = ZERO;
        BigInteger f = ONE.shiftLeft(scale).subtract(valueOf(x));
        BigInteger c = ONE.negate().shiftLeft(scale);
        int maxk = 99;
        for (int k = 1; k <= maxk; k++) {
            c = c.multiply(f);
            r = r.multiply(valueOf(k)).shiftLeft(scale).add(c);
        }
        for (int k = 1; k <= maxk; k++) {
            r = r.divide(valueOf(k));
        }
        r = r.shiftRight(maxk * scale);
        return r.longValue();
    }
}

http://ideone.com/IC7lmg

0

Przecież przy wszystkich rozwinięciach w szereg (no prawie) warunek jest abs(x)<1, przy 1 lub więcej ma prawo liczyć cokolwiek.

0

http://pl.wikipedia.org/wiki/Logarytm_naturalny#Rozwini.C4.99cie_w_szereg_Maclaurina
Szereg ma działać dla 0 < x <= 2, przy czym błąd dla powyższego algorytmu jest duży już np dla x = 0.7 lub x = 1.3. Dla x < 0.2 błąd jest bardzo duży.

0

A do którego n liczysz?

0

W kodzie powyżej to 99, ale wyższe wartości, tzn typu 999 absolutnie nic nie pomagają.

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