2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Сложение чисел, сильно различающихся по значению
Сообщение27.10.2016, 19:42 
Заслуженный участник


29/12/14
504
Доброго времени суток. Предположим, у нас есть сравнительно большой ($10^6$) массив, сотоящий из чисел формата двойной точности в некотором интервале $\sim [-10^{27};10^{27}]$, распределение более-менее равномерное. Мы разбрасываем их случайным образом по массиву и начинаем складывать.

1. По индексам от $i = 1$ до $i = 10^6$.
2. В обратную сторону.
3. Сортируем числа по их значению, складываем.
4. То же самое, но теперь сумма в формате более высокой точности.

Я понимаю, что верить первым двум ответам нельзя, потому что будут возникать ситуации типа $a + b$ при $\lvert a \rvert \ll \lvert b \rvert$. А вот чему верить из последних двух вариантов? Переполнения быть не должно при суммировании, поскольку формат двойной точности числа до $\sim 10^{38}$ позволяет записывать. Так что не очень понимаю, где можно прикопаться в 3-м варианте. А в 4-м, казалось бы, всё ещё лушче быть должно. Или какие-то хитрые округления всю малину портят?

 Профиль  
                  
 
 Re: Сложение числен
Сообщение27.10.2016, 20:01 
Аватара пользователя


21/09/12

1871
3. В этом варианте сортировать надо по модулю. И суммировать с минимального значения модуля.

 Профиль  
                  
 
 Re: Сложение числен
Сообщение27.10.2016, 20:02 
Заслуженный участник


04/05/09
4587
Может быть ещё ситуация $a+b$ где $a \approx -b$.
Даже без специально подобранных значений абсолютное значение суммы ожидается около $\frac{10^{27}}{\sqrt{10^6}}=10^{24}$.
Самые большие числа имеют абсолютную погрешность представления double и ошибку суммирования порядка $10^{27}\cdot 10^{-15} =10^{12}$, значит относительная точность результата получается $10^{-12}$, заметно хуже точности double.
Возможно, ошибку суммирования можно улучшить, складывая числа в порядке роста абсолютной величины, но всё равно, вряд ли имеет смысл говорить о точности суммы большей, чем точность исходного представления больших чисел.

 Профиль  
                  
 
 Re: Сложение чисел, сильно разлечающихся по значению
Сообщение27.10.2016, 20:09 
Заслуженный участник


29/12/14
504
atlakatl
Не могли бы вы поподробнее объяснить этот момент? Почему именно так?

venco
В последнем случае, к слову, ответ получается 0, кажущийся мне правдоподобным (задача учебная).

 Профиль  
                  
 
 Re: Сложение чисел, сильно разлечающихся по значению
Сообщение27.10.2016, 20:38 
Аватара пользователя


21/09/12

1871
Gickle
Если суммировать в обычном порядке, то у нас сумма начнётся с больших отрицательных чисел и по мере приближения к нолю и в его положительной окрестности мелкие значения будут "съедаться" за счёт ограниченной разрядности представления чисел.
Грубый пример. Точность 3 знака. Есть массив $(-16200, -9870, -124, -12, 35, 358, 4560, 13900)$
Точное суммирование даёт -7353. Суммирование с минимального значения - и округления на каждом шаге суммы до трёх знаков - даёт -7300. А аналогичное суммирование в порядке возрастания модуля - $-12+35-124+358+4560-9870+13900-16200$ даёт -7350.

 Профиль  
                  
 
 Re: Сложение чисел, сильно разлечающихся по значению
Сообщение27.10.2016, 23:08 
Заслуженный участник


26/05/14
981
Отличная задача!

Пятый вариант для положительных чисел:
Собираем все числа в кучу, удаляем два наименьших, помещаем обратно их сумму. Повторяем пока в куче не останется одно число. Этот вариант улучшает суммирование отсортированных чисел. О-большое остаётся таким же.

Ещё замечание: сортировать числа не обязательно, достаточно собрать их в корзины по показателям степеней. С точки зрения О-большого это лучше. Можно показать, что точность у корзин и у сортировки будет одинаковая.

Если числа разных знаков, то можно предложить такой "алгоритм": выбираем из набора пару чисел с минимальной по модулю суммой. Числа удаляем, сумму помещаем обратно в набор. Этот алгоритм соответствует кучевому алгоритму для положительных чисел. Осталось додумать как выбирать пару с минимальной суммой.

 Профиль  
                  
 
 Re: Сложение чисел, сильно разлечающихся по значению
Сообщение27.10.2016, 23:27 
Заслуженный участник


29/12/14
504
atlakatl
Ой-ой, действительно. Стыдно, что сам не подумал об этом. К слову, это получается, что простым способом типа $sum = sum + a[i]$ "жирные" (в смысле суммы) массивы вообще плохая идея суммировать? То есть, грубо говоря, начиная с какого-то момента $sum$ "разгонится" так или иначе, и дальше уже всё плохо будет.

slavav
Да, я вот сейчас тоже задумался в таком направлении. :)

 Профиль  
                  
 
 Re: Сложение чисел, сильно разлечающихся по значению
Сообщение27.10.2016, 23:28 
Заслуженный участник


27/04/09
28128
Есть ещё способ суммирования с небольшой коррекцией потери точности: Kahan summation algorithm. Или можно делить массив рекурсивно на части, складывая их суммы (упомянуто и в статье в «Alternatives»). Не знаю, насколько лучше объединять эти вещи с сортировкой/разделением по показателям.

 Профиль  
                  
 
 Re: Сложение чисел, сильно разлечающихся по значению
Сообщение28.10.2016, 00:02 


12/07/15
3316
г. Чехов
Шестой вариант.
Рассуждение:
1. Наиболее лучшими с точки зрения потери точности являются операции с числами, близкими по модулю. Сортируем по модулю. Принцип "разделяй и властвуй": складываем соседние числа попарно, из миллиона чисел получаем $500000$ компонентов суммы. Затем выполняем еще попарное сложение - получаем $250000$ тысяч компонентов и т.д.
2. Для ускорения вычисления суммы: нет смысла вычислять слишком мелкие компоненты суммы, так как они могут выпасть из разрядности формата конечной суммы. Допустим массив компонентов отсортирован по убыванию, первые $i$ компонентов дают в сумме $S_a$, последующие $(n-i)$ компонентов в сумме равны $S_b$. Можно не вычислять $S_b$, если $|S_a|>>|S_b|$. Предлагается находить разрывы между соседними компонентами суммы $S_i$ и $S_{i+1}$. Самое простое - разрывом считать условие $|S_i|>>(n-i)\cdot |S_{i+1}|$. Если условие соблюдается, то $(n-i)$ последних компонент суммы можно отбросить.
Можно придумать другие условия разрывов, которые дадут более эффективное вычисление, в том числе вероятностные.

 Профиль  
                  
 
 Re: Сложение чисел, сильно разлечающихся по значению
Сообщение28.10.2016, 00:11 
Заслуженный участник


27/04/09
28128
$\gg$ — это в физике, может, и условие, а в CS не условие.

 Профиль  
                  
 
 Re: Сложение чисел, сильно разлечающихся по значению
Сообщение28.10.2016, 00:28 


12/07/15
3316
г. Чехов
В вычислениях можно определить это условие, зная только характеристики формата вещественного числа.
P.S. Сама сортировка - это очень плохая мысль, пусть уж лучше будет что-то вроде Кэхэна, только на русском языке. :D

 Профиль  
                  
 
 Re: Сложение чисел, сильно разлечающихся по значению
Сообщение28.10.2016, 00:42 
Заслуженный участник


26/05/14
981
Mihaylo в сообщении #1163654 писал(а):
Сама сортировка - это очень плохая мысль
Почему?
Сортировка значительно улучшает точность в большинстве случаев, и очень просто реализуется. Что с ней не так?

 Профиль  
                  
 
 Re: Сложение чисел, сильно разлечающихся по значению
Сообщение28.10.2016, 01:10 
Заслуженный участник


27/04/09
28128

(Оффтоп)

Mihaylo в сообщении #1163654 писал(а):
В вычислениях можно определить это условие, зная только характеристики формата вещественного числа.
Так мы же знаем: двойная точность — IEEE 754 binary64. Хотя нет проблем и для произвольных параметров.

 Профиль  
                  
 
 Re: Сложение чисел, сильно разлечающихся по значению
Сообщение28.10.2016, 18:00 


12/07/15
3316
г. Чехов
slavav в сообщении #1163660 писал(а):
Сортировка значительно улучшает точность в большинстве случаев, и очень просто реализуется. Что с ней не так?

Сортировка+сложение работает медленнее, чем просто точное сложение или некое умное простое сложение. Какова цель алгоритма? Экономия времени или высокая точность?

 Профиль  
                  
 
 Re: Сложение чисел, сильно разлечающихся по значению
Сообщение28.10.2016, 18:19 
Заслуженный участник


26/05/14
981
Цель алгоритма получить достаточно точную сумму быстрее чем это сделает точное сложение.
Есть примеры в которых точное сложение заведомо медленнее сортировки. То есть, сортировку нельзя отбрасывать исходя только из требований производительности.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group