![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Vitaly333 |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: 2 Всего: 2 |
Тут просходит скалярное умножение двух векторов. В 1-ом случае вектора перемножаются целиком с 1 - ого до последнего элемента. Результат записывается в переменную res. Во 2-ом случае умножение разделено на две части. Результаты записываются в res1 и res2 соответственно и потом складываются. В обоих случаях результат получается очень близким друг к другу но всё же отличным в 13 - 15 знаке Вот пример случайного запуска:
Почему так происходит? |
||||
|
|||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Не удивительно - в операциях с вещественными числами (float, double) ошибки округления зависят от порядка выполнения операций.
|
|||
|
||||
| Vitaly333 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: 2 Всего: 2 |
Хорошо, тогда в каком случае резудьтат считается более точным? |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Ошибка округления при вычислениях имеет обыкновение накапливаться. Алгоритмы анализируют на чувствительность к ошибкам округления. Абсолютно точны только целочисленные вычисления. Если не ошибаюсь, это предмет науки "Численные методы".
|
|||
|
||||
| rygel |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 21.9.2007 Где: Харьков Репутация: 6 Всего: 7 |
Используй BigDecimal
|
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Второй вариант скорее всего более точный.
Отсортируй массив произведений. Начинай складывать с меньших по модулю. |
|||
|
||||
| gosnis |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 16.5.2007 Где: Тель Авив, Израил ь Репутация: нет Всего: 2 |
Что то я немного торможу. Почему второй вариант более точный? Чем они вообще отличаются с математической точки зрения? |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Ну допустим нужно сложить 1 и 1E11 раз 1E-11, сложение с точностью 10 знаков.
Если начинать складывать с 1 получишь результат 1 (1 + 1E-11 = 1). Если складывать меньшие из оставшихся, получишь правльный результат 2. |
|||
|
||||
| dorogoyIV |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1503 Регистрация: 26.3.2007 Репутация: 3 Всего: 46 |
||||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |