| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Два раззных результата при одних и тех же действия |
| Автор: Vitaly333 26.2.2009, 17:07 | ||||
Тут просходит скалярное умножение двух векторов. В 1-ом случае вектора перемножаются целиком с 1 - ого до последнего элемента. Результат записывается в переменную res. Во 2-ом случае умножение разделено на две части. Результаты записываются в res1 и res2 соответственно и потом складываются. В обоих случаях результат получается очень близким друг к другу но всё же отличным в 13 - 15 знаке Вот пример случайного запуска:
Почему так происходит? |
| Автор: COVD 26.2.2009, 18:11 |
| Не удивительно - в операциях с вещественными числами (float, double) ошибки округления зависят от порядка выполнения операций. |
| Автор: Vitaly333 26.2.2009, 21:32 | ||
Хорошо, тогда в каком случае резудьтат считается более точным? |
| Автор: COVD 26.2.2009, 22:25 |
| Ошибка округления при вычислениях имеет обыкновение накапливаться. Алгоритмы анализируют на чувствительность к ошибкам округления. Абсолютно точны только целочисленные вычисления. Если не ошибаюсь, это предмет науки "Численные методы". |
| Автор: rygel 27.2.2009, 08:33 |
| Используй BigDecimal |
| Автор: math64 27.2.2009, 09:11 |
| Второй вариант скорее всего более точный. Отсортируй массив произведений. Начинай складывать с меньших по модулю. |
| Автор: gosnis 27.2.2009, 12:38 | ||
Что то я немного торможу. Почему второй вариант более точный? Чем они вообще отличаются с математической точки зрения? |
| Автор: math64 1.3.2009, 14:41 |
| Ну допустим нужно сложить 1 и 1E11 раз 1E-11, сложение с точностью 10 знаков. Если начинать складывать с 1 получишь результат 1 (1 + 1E-11 = 1). Если складывать меньшие из оставшихся, получишь правльный результат 2. |
| Автор: dorogoyIV 1.3.2009, 17:29 |
иногда математика не очень точная наука пользуйся принятыми всеми методами (а то ведь можно и иголочки побросать - метод Монте-Карло например) |