Есть лучшее решение для этого математического вычисления?(Джава) - PullRequest
2 голосов
/ 19 сентября 2011

У меня есть программа на Java, которую я должен сделать для домашней работы, и вот формула, которую я должен использовать: изображение формулы . Извините, я не являюсь носителем английского языка и не знаю названия этой формулы.

Я написал это решение:

/* Check: 
 * if: j<=3:
 * 
 * 1/1+sqrt2=0,414213562
 * 1/sqrt2+sqrt3=0,317837245
 * 1/sqrt3+sqrt4=0,267949192
 *      res= 0,9999999 =~1.0
 */
double sum = 0;
for (int j = 2; j <= 624; j++) 
{
    sum += 1 / ((Math.sqrt(j) + Math.sqrt(j + 1)));
}
double res = 0;
res = (double)1 / (1 + Math.sqrt(2)) + sum;

System.out.println("Result is: "  + res);

Я проверил программу на значения от j=2 до j=3, и она дала правильный результат (около 1,0). Поэтому я думаю, что это работает хорошо. Но когда я попробовал до j<=624, мой результат: 24.000000000000014

1. Как сделать так, чтобы в моей программе результат был 24,0, а не 24,000000000014?

2. Есть ли лучшее решение / исходный код для этой математической формулы? Как называется эта формула на английском?

Ответы [ 3 ]

6 голосов
/ 19 сентября 2011

Добро пожаловать в мир вычислений с плавающей точкой. Если вы не можете переписать свою формулу с использованием алгебры таким образом, чтобы использовать меньшее количество терминов или быстрее сходиться, вам не повезло - вычисления с плавающей запятой никогда не бывают точными и накапливают ошибки, как вы можете видеть из своего примера.

(конкретный совет в этом случае: ваши термины имеют вид X k = 1 / (sqrt (k) + sqrt (k + 1)). Попробуйте умножить числитель и знаменатель на sqrt ( k + 1) - sqrt (k))

0 голосов
/ 19 сентября 2011

Для вычислений Java необходимо использовать BigDecimal.

0 голосов
/ 19 сентября 2011

1-й вопрос: используйте функцию Math.round (double), которая возвращает ближайшее целое число двойного числа.

Вы также можете использовать Math.floor (double) для получения ближайшего целого числа, которое меньше двойногоили math.ceil (double), который возвращает ближайшее целое число, которое больше, чем double.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...