#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, может привести к почти бесконечному циклу.