ошибка в цикле с инструкцией if, но компилируется и завершается без ошибок без отображения ожидаемого результата

#java #if-statement

#java #if-statement

Вопрос:

При решении вопроса (это в коде как комментарий.) Инструкция if (которая отображает результат) не работает. Пожалуйста, помогите мне разобраться в ошибке. Он компилируется и запускается, но выходные данные не отображаются.

 /*
 * (Calculating the Value of π ) Calculate the value of π from the infinite series
         4     4     4     4      4
π = 4 – ---   --- – ---   --- – ------   ...
         3     5     7     9      11
Print a table that shows the value of π approximated by computing the first 200,000 terms of this
series. How many terms do you have to use before you first get a value that begins with 3.14159?
 */
public class ValueOfPi 
{
    public static void main(String[] args)
    {
        int i,count=0;
        double pi=0.0,n=1.0,PI=3.14159;
        for(i=0;i<200000;i  )
        {
            count  ;
            if(count%2!=0)
            {
                pi=pi (4/n);
            }
            else if(count%2==0)
            {
                pi=pi-(4/n);
            }
            n=n 2;
            if(pi==PI)
            {
                System.out.printf("terms=%d     PI=%fn",count,pi);
                break;
            }
        }
    }
}
  

Ответ №1:

Причина, по которой оператор if не работает, заключается в том, что вы сравниваете числа с плавающей запятой для равенства. Страница, что каждый специалист по информатике должен знать об арифметике с плавающей запятой, объясняет почему.

После повторного прочтения вопроса OP в этом случае я бы сначала преобразовал вычисленное значение pi в строку длиной 8 или более символов и сравнил первые 7 символов с «3.14159».

Комментарии:

1. Спасибо, но это не сработает, поскольку значение pi при каждом сложении или вычитании (4 / n) увеличивает или уменьшает значение pie. например, первые 10 отсчетов дают 4.000000, 2.666667, 3.466667, 2.895238, 3.339683, 2.976046, 3.283738, 3.017072, 3.252366, 3.041840. который не выполняется последовательно в порядке возрастания или убывания.

2. попробуйте if (Math.abs(pi - PI) < 0.000005)

Ответ №2:

Первая плавающая точка является неточной — приближением суммы (отрицательных) степеней двойки — (также с 3.14159), и вычисленное pi может быть выше или ниже заданного значения.

Также используйте %n as n — это конец строки Linux, а не Windows, где она есть rn . Это могло бы предотвратить очистку буфера строк для вывода. (Не уверен, у меня Linux).

         if (Math.abs(pi - PI) < 1.0E-5)
        {
            System.out.printf("terms=%d     PI=%f%n",count,pi);
            break;
        }
  

Также вы могли бы использовать Math.PI для лучшего приближения. Теперь вы рискуете получить более точную, pi чем PI нуждающуюся в этой неточности 0.00001.

Использование == или слишком малого запаса eps, например 0.00000001, может привести к почти бесконечному циклу.