Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Два раззных результата при одних и тех же действия 
:(
    Опции темы
Vitaly333
Дата 26.2.2009, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: 2
Всего: 2



Код

int n = 100;
     double[] a,b;
     int i;
     a = new double[n]; // Vector a
     b = new double[n]; // Vector b
     
     double res,res1,res2;
     res  = 0.0;
     res1 = 0.0;
     res2 = 0.0;
     
     Random r = new Random();
     for (i = 0;i<n;i++){
        a[i] = r.nextDouble();
        b[i] = r.nextDouble();                  
     }
          
     for (i = 0;i<n;i++) res+=a[i]*b[i];     
     System.out.println("Result = " + res);
     
     
     res = 0.0;
     for (i = 0;i<n/2;i++) res1+=a[i]*b[i];
     for (i = n/2;i<n;i++) res2+=a[i]*b[i];
     res = res1+res2;
     System.out.println("Result = " + res);


Тут просходит скалярное умножение двух векторов. В 1-ом случае вектора перемножаются целиком с 1 - ого до последнего элемента. Результат записывается в переменную res. Во 2-ом случае умножение разделено на две части. Результаты записываются в res1 и res2 соответственно и потом складываются. В обоих случаях результат получается очень близким друг к другу но всё же отличным в 13 - 15 знаке
Вот пример случайного запуска:

Код

Result = 19.682322519550098
Result = 19.682322519550105

Почему так происходит?
PM MAIL   Вверх
COVD
Дата 26.2.2009, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Не удивительно - в операциях с вещественными числами (float, double) ошибки округления зависят от порядка выполнения операций.
PM MAIL   Вверх
Vitaly333
Дата 26.2.2009, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: 2
Всего: 2



Цитата

Не удивительно - в операциях с вещественными числами (float, double) ошибки округления зависят от порядка выполнения операций. 

Хорошо, тогда в каком  случае резудьтат считается более точным?
PM MAIL   Вверх
COVD
Дата 26.2.2009, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Ошибка округления при вычислениях имеет обыкновение накапливаться. Алгоритмы анализируют на чувствительность к ошибкам округления. Абсолютно точны только целочисленные вычисления.  Если не ошибаюсь, это предмет науки "Численные методы".
PM MAIL   Вверх
rygel
Дата 27.2.2009, 08:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 21.9.2007
Где: Харьков

Репутация: 6
Всего: 7



Используй BigDecimal
PM MAIL   Вверх
math64
Дата 27.2.2009, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Второй вариант скорее всего более точный.
Отсортируй массив произведений. Начинай складывать с меньших по модулю.
PM   Вверх
gosnis
Дата 27.2.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 16.5.2007
Где: Тель Авив, Израил ь

Репутация: нет
Всего: 2



Цитата(math64 @ 27.2.2009,  09:11)
Второй вариант скорее всего более точный.
Отсортируй массив произведений. Начинай складывать с меньших по модулю.

Что то я немного торможу. Почему второй вариант более точный? Чем они вообще отличаются с математической точки зрения?
PM MAIL ICQ Skype MSN   Вверх
math64
Дата 1.3.2009, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Ну допустим нужно сложить 1 и 1E11 раз 1E-11, сложение с точностью 10 знаков.
Если начинать складывать с 1 получишь результат 1 (1 + 1E-11 = 1).
Если складывать меньшие из оставшихся, получишь правльный результат 2.
PM   Вверх
dorogoyIV
Дата 1.3.2009, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



Цитата(gosnis @  27.2.2009,  12:38 Найти цитируемый пост)
с математической точки зрения

иногда математика не очень точная наука  smile 
пользуйся принятыми всеми методами (а то ведь можно и иголочки побросать - метод Монте-Карло например)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0495 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.