Nachkommastellen von Pi

Hey Leute.

Ich war auf der Suche nach einer Möglichkeit, die nachkommastellen von pi
nacheinander zu berechnen, also ohne dabei auf die nachkomma limits von datentypen
zu stoßen.
Dabei stieß ich auf der Seite: http://www.pi-zahl.de/
auf folgende Grafik:

das soll eigentlich genau das machen, was ich will, aber… wie genau?
Ich verstehs nicht… jemand ne idee?

Was verstehst du nicht.

summe=0

dann zählst du 1/1 dazu

dann zählst du 1/4 dazu

dann zählst du 1/9 dazu

dann zählst du 1/16 dazu

dann nimmst du das ergebnis mal 6

dann ziehst du die wurzel und hast pi

Probleme mit Dezimaldarstellungen, Näherungen gehen aber durch diese Methode nicht weg (aber du kannst abschätzen, wie genau deine Näherung sein wird).

erstaunlich gemütliche Näherung, es braucht ein n über 500 um überhaupt 3.14 zu sehen,
bei 100.000 keine 5 richtige Nachkommastellen…

Wurzel für BigDecimal nach

public class Test
{


    public static void main(String[] args)
    {
        BigDecimal sum = new BigDecimal(0);
        for (int i = 1; i <= 100000; i++)
        {
            BigDecimal k = new BigDecimal(i);
            k = k.multiply(k);
            k = BigDecimal.ONE.divide(k, 1500, RoundingMode.HALF_DOWN);
            sum = sum.add(k);

            if (i % 10000 == 0)
            {
                BigDecimal p = sum.multiply(new BigDecimal(6));
                p = bigSqrt(p);
                System.out.println("i: " + i + " - " + p);
            }
        }
    }

    private static final BigDecimal SQRT_DIG = new BigDecimal(1500);
    private static final BigDecimal SQRT_PRE = new BigDecimal(10).pow(SQRT_DIG.intValue());

    /**
     * Private utility method used to compute the square root of a BigDecimal.
     * 
     * @author Luciano Culacciatti
     * @url http://www.codeproject.com/Tips/257031/Implementing-SqrtRoot-in-BigDecimal
     */
    private static BigDecimal sqrtNewtonRaphson(BigDecimal c, BigDecimal xn, BigDecimal precision)
    {
        BigDecimal fx = xn.pow(2).add(c.negate());
        BigDecimal fpx = xn.multiply(new BigDecimal(2));
        BigDecimal xn1 = fx.divide(fpx, 2 * SQRT_DIG.intValue(), RoundingMode.HALF_DOWN);
        xn1 = xn.add(xn1.negate());
        BigDecimal currentSquare = xn1.pow(2);
        BigDecimal currentPrecision = currentSquare.subtract(c);
        currentPrecision = currentPrecision.abs();
        if (currentPrecision.compareTo(precision) <= -1)
        {
            return xn1;
        }
        return sqrtNewtonRaphson(c, xn1, precision);
    }

    /**
     * Uses Newton Raphson to compute the square root of a BigDecimal.
     * 
     * @author Luciano Culacciatti
     * @url http://www.codeproject.com/Tips/257031/Implementing-SqrtRoot-in-BigDecimal
     */
    public static BigDecimal bigSqrt(BigDecimal c)
    {
        return sqrtNewtonRaphson(c, new BigDecimal(1), new BigDecimal(1).divide(SQRT_PRE));
    }

}

für die 1 Million Stellen auf dem ursprünglichen Link wurde hoffentlich effizienter gerechnet als hier :wink:
wobei das Aufaddieren der geteilten Quadrate ja noch eher einfache Mathematik ist