Ява вычислить пи до 6 значимых фигур

У меня возникли проблемы с этой программой, мы должны вычислить число пи до шести значащих цифр, БЕЗ ОКРУГЛЕНИЯ и БЕЗ использования константы математической библиотеки, программа должна также показать количество итераций, необходимых для достижения точности 6 сигов, а также математическая константа в выходных данных, так что пока я просто пытаюсь разобраться с вычислением числа пи, я совершенно заблудился о том, как получить шесть 6 фигур с округлением или без него, не говоря уже о том, как итерировать, сколько итераций потребовалось для достичь 6 сиг фиг, пожалуйста, помогите.

Напишите алгоритм и программу для вычисления π, используя формулу, описанную в тексте PI/4 =1-(1/3)+(1/5)-(1/7)+(1/9)...."Вывод будет включать в себя ваше вычисленное значение для π, ожидаемое значение константы математической библиотеки для π и количество итераций, необходимых для достижения точности шестизначного числа. Число итераций может превышать 250 000. Сделайте ваш вывод чистым и легким для чтения для сравнивая результаты.

Это код, который я до сих пор вычислял, но даже я не уверен, что это правильно.

public static void main(String[] args) throws Exception {      
    Double pi=1.0;
    int s=1;
    for (double j=3.0; j<100.0; j=j+2)
    {
        if (s % 2 == 0)
            pi = pi + (1/j);
        else
            pi = pi - (1/j);
        s = s + 1;
    }
    System.out.println(4*pi);

3 ответа

Решение

Рассматривать

        String piStr = "3.14159";
        Double pi=1.0;
        int s=1;
        double j=3.0; 
        String lcl = "";
        String upToNCharacters = "";
        while (true)
        {
            if (s % 2 == 0)
                pi = pi + (1/j);
            else
                pi = pi - (1/j);

            s = s + 1;
            j=j+2;

            lcl = "" + 4 * pi;
            upToNCharacters = lcl.substring(0, Math.min(lcl.length(), 7));
            if (upToNCharacters.equals(piStr)) {
                break;
            }
        }
        System.out.println(upToNCharacters);
        System.out.println("after " + s);

выход

3,14159

после 136121

Таким образом, вероятно, существует способ сделать априорную оценку ошибки, используя теорему о чередующемся ряду. Но предположим, что вы не знаете теорему или не доверяете своей математике (если вы это сделаете, просто измените 100.0 выше на правильное число. 800000.0, как указано выше, сработает, только). Возможно, здесь есть что-то более безопасное, хотя, возможно, лучше проверять достоверность оценки только через 1000 раз, а не каждый раз?

Double pi=1.0; Boolean closeEnough=false;
    int s=1;
    for (double j=3.0; (!closeEnough); j=j+2)
    {
        if (s % 2 == 0)
            pi = pi + (1/j);
        else
            pi = pi - (1/j);
        if (Math.abs(4/(j+2))<0.000005)
            closeEnough=true;

        s = s + 1;
    }

В идеале вы должны инкапсулировать ваши вычисления в классе:

public class PI {
    private double estimate = 1.0;
    private int iteration = 0;

    public double getEstimate() {
        return 4 * estimate;
    }

    public void iterate() {
        double ratio = 1.0 / (iteration * 2 + 3);
        if (iteration % 2 == 0)
            estimate -= ratio;
        else
            estimate += ratio;
        iteration++;
    } 
}

Тогда цикл становится довольно тривиальным:

PI pi = new PI();
while (Math.round(pi.getEstimate() * 1e5) != Math.round(Math.PI * 1e5))
    pi.iterate();

Для меня это заняло 130 657 итераций

Другие вопросы по тегам