#java #loops
#java #циклы
Вопрос:
Поэтому я решил попробовать серию Лейбница (ОЦЕНКА PI)
PI/4 = 1/3 - 1/5 1/7 - 1/9 1/11 etc...
Вот мой код:
import java.util.Scanner;
public class PIEstimator{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter number of Iterations:");
int n = sc.nextInt();
double sum = 0;
//START OF Leibniz series
for (int i=1; i < n; i ) {
double calculations = Math.pow(-1,i 1) / (2 * i 1);
sum = sum = calculations;
System.out.println(sum 3);
}
}
}
И вот мой вывод, если n = 12
3.3333333333333335
3.1333333333333333
3.276190476190476
3.165079365079365
3.255988455988456
3.179065379065379
3.2457320457320455
3.186908516320281
3.2395400952676496
3.1919210476486017
3.235399308518167
Мой вопрос:
Почему выходные данные не сходятся к 3.14159265 …….?
Моя математика неверна?
Спасибо заранее!
Ответ №1:
Попробуйте это.
for (int i=1; i < n; i ) {
double calculations = Math.pow(-1,i 1) / (2 * (i-1) 1);
sum = calculations;
}
System.out.println(4*sum);
- Во-первых, первый знаменатель должен быть равен 1, поэтому
2*(i-1) 1 = 0 1 = 1.
- Во-вторых, помните, что ряд вычисляет
pi/4
, поэтому вам нужно mutiply by4
.
Вот предложение. Вместо того, чтобы выполнять накладные расходы Math.pow, просто используйте тернерный оператор ( ?:
), чтобы увидеть, i
четный или нечетный, и соответствующим образом измените знак.
double calculations = ((i % 2) == 0 ? -1. : 1.) / (2.*(i-1) 1);
Комментарии:
1. Кажется, ваш код работает хорошо, но он входит в диапазон 2.6666; Я хочу, чтобы он всегда был в диапазоне 3. Тем не менее, ваш ответ очень чистый!
2. Первая итерация всегда будет равна 2.6666. Такова природа алгоритма. Я переместил окончательный ответ за пределы цикла, чтобы вы не получили все итерации. Но мой алгоритм верен. Я также объяснил, что вы делали неправильно.
3. Это прояснило ситуацию для меня, спасибо, я приму ваш ответ, поскольку он на 100% отвечает на мой вопрос!
4. Было бы весьма полезно проголосовать за этот вопрос
5. Я случайно отклонил ваш ответ, теперь он повторно принят
Ответ №2:
Это работает нормально (я его протестировал):
for (int i=1; i < n; i ) {
double calculations = Math.pow(-1,i) / (2 * i 1);
sum = calculations;
System.out.println((sum 1) * 4);
}
Комментарии:
1. @Jackov Kusic После многих запусков я понял, что это действительно работает нормально, я просто ограничил количество циклов!
2. Но ваш ответ говорит мне только о том, что он работает, но если вы посмотрите на ответ @WJS, он покажет мне другой способ, которым алгоритм может работать!