Вычислить Pi для определенного количества терминов в Java?

Мне дали следующее задание, и мой код не работает. Вопрос в том:

Используя цикл while или do-while, напишите программу для вычисления PI по следующему уравнению: PI = 3 + 4/(2*3*4) - 4/(4*5*6) + 4/(6* 7*8) - 4/(8*9*10) + ... Разрешить пользователю указывать количество терминов (показано 5 терминов) для использования в вычислении. Каждый раз в цикле к оценке PI следует добавлять только один дополнительный член.

Это код, который у меня есть: import java.util.Scanner; импортировать javax.swing.JOptionPane; импортировать java.lang.Math;

public class LabFriday25 {

public static void main(String[] args) {
    String termInput = JOptionPane.showInputDialog(null, "How many terms of 
                                 PI would you like?");
    Scanner termScan = new Scanner (termInput);

        double termNum = termScan.nextDouble();
        double pi = 3;
        int count = 0;
        double firstMul = 2;
        double secMul = 3;
        double thirdMul = 4;
        double totalMul = 0;

                while (count<= termNum)
                {
                    if (termNum==1)
                    {
                        pi = 3.0;
                    }

                    else if (count%2==0)
                    {
                        totalMul= (4/(firstMul*secMul*thirdMul));
                    }

                    else
                    { 

                       totalMul = -(4/((firstMul+2)*(secMul+2)*(thirdMul+2)));
                    }
                pi = pi + (totalMul);

                firstMul = firstMul + 2;
                secMul = secMul + 2;
                thirdMul = thirdMul + 2;
                //totalMul = (-1)*totalMul;
                count++;
            }


        JOptionPane.showMessageDialog(null, "The value of pi in " + termNum + " terms is : " + pi);
    }

}

Я не могу понять, почему код не возвращает правильное значение для 3 или более членов числа Пи, он каждый раз дает одно и то же значение.

РЕДАКТИРОВАТЬ: я удалил точку с запятой в конце оператора while, и теперь код возвращает значение 3.0 для любого количества терминов, введенных пользователем. Где я ошибаюсь?

EDIT2: удалено условие из цикла while. Ответы близки к правильным, но все же недостаточно точны. Как я могу исправить это, чтобы дать мне правильный ответ?


person user2928362    schedule 28.10.2013    source источник
comment
Не очень хорошая реализация, которую я вижу. Попробуйте это: math.hmc.edu/funfacts/ffiles/30001.1-3 .shtml   -  person duffymo    schedule 28.10.2013


Ответы (1)


Точка с запятой в конце оператора while оценивается независимо, в результате чего тело цикла выполняется безоговорочно, поэтому результат всегда один и тот же.

while (count > 0 && count <= termNum);
                                     ^

Кроме того, цикл завершается после первой итерации. Удалить первое выражение из цикла, т.е.

while (count <= termNum) {
person Reimeus    schedule 28.10.2013
comment
Я удалил точку с запятой, но теперь код возвращает значение 3.0 для любого количества терминов, введенных пользователем. Есть идеи? - person user2928362; 28.10.2013
comment
Да, ваш цикл выходит из строя после первой итерации - просто проверьте, что число меньше, чем число верхней границы - person Reimeus; 28.10.2013
comment
Теперь ответ меняется, и это хорошо. Моя проблема в том, что он не возвращает правильные значения. Они ближе к истине, но все же не совсем верны. - person user2928362; 28.10.2013
comment
Возвращаемые результаты являются правильными в соответствии с входным уравнением, поэтому уравнение представляет собой очень приблизительное приближение к PI, т. е. оно является настолько точным, насколько это возможно при использовании этого уравнения. - person Reimeus; 28.10.2013
comment
Ничто не гарантирует, что количество членов в ряду будет таким же, как правильное количество цифр по сравнению с числом Пи. - person Traklon; 28.10.2013
comment
Есть ли способ повысить точность? Я не могу использовать другое уравнение, лектор хочет именно это. Другие в моем курсе нашли правильный ответ, поэтому мне интересно, есть ли способ сделать это. - person user2928362; 28.10.2013
comment
Добавление 4 ко всем переменным Mul приводит к тому, что делители искажаются и не соответствуют исходной формуле. Вот где отладчик пригодится :) - person Reimeus; 28.10.2013