Подскажите пожалуйста как компьютер суммирует плохо сходящиеся ряды. У него конечная точность вычислений, и если прибавлять члены которые много меньше текущей суммы ряда, то точности может не хватить. Т.е. компьютер не сможет прибавить одну миллиардную к сумме членов которую он уже посчитал. И при дальнейшем суммировании будет выдавать один и тот же результат.
-
3он суммирует их ровно так, как Вы его научите. – KoVadim Dec 11 '16 at 21:34
-
При нынешней цене на память, вряд ли встанет задача, когда может не хватить точности. – Vladimir Gamalyan Dec 12 '16 at 06:22
-
2Вам наверняка будет интересен вот этот вопрос: Вычисления на числах с плавающей точкой не работают – Nick Volynkin Dec 12 '16 at 07:26
2 Answers
Для "плохо сходящихся" рядов нужно использовать специальные алгоритмы расчёта.
Простейший алгоритм - это расчёт суммы блоков элементов и последующее суммирование сумм этих блоков. Размер блока выбирается так, чтобы при расчёте его суммы потери точности были минимальны (например, начинать новый блок, когда порядок очередного члена уменьшится по сравнению с предыдущим). Хорошо работает для монотонных рядов, но плохо для знакопеременных, для которых этот алгоритм модифицируют, считая отдельно блоки чётных и нечётных элементов.
Само собой суммирование сумм блоков выполняют от меньших к бОльшим.
- 31,807
Если стоит задача не потерять точность, то следует использовать соответствующие типы/библиотеки. Например для python точность для Decimal ограничена только оперативной памятью (по умолчанию 28 знаков):
from decimal import Decimal
s = Decimal(0)
s += Decimal(100000000000000)
s += Decimal(0.0000000000001)
print (s)
100000000000000.0000000000001
- 7,733
-
насчёт цены на память: знакомые занимаются моделированием океанов, там в ходу умножение кубических матриц порядка 1000х1000х1000. Вроде неплохо так памяти требует. )) – Nick Volynkin Dec 12 '16 at 06:50
-
Насчёт классов: а как внутри устроен Decimal? Он хранит число, как строку? – Nick Volynkin Dec 12 '16 at 06:52
-
@NickVolynkin Ну с учетом того, что есть быстрые SSD, такая матрица наверное не проблема, хотя согласен, есть задачи где затык в объемах данных. На счет хранения не в курсе, тип встроенный, наверное от реализации зависит. Хотя я бы не стал в виде строки хранить (слишком расточительно), может быть что-то вроде long (который берет столько байтов, сколько нужно под хранение числа) + позицию запятой. – Vladimir Gamalyan Dec 12 '16 at 07:04
-
@NickVolynkin, формат хранения DECIMAL описывается стандартом IEEE 754. Им установлены три варианта - Decimal32, Decimal64 и Decimal128. Если интересуют подробности, лучше читать сам стандарт - там ну очень много текста... – Akina Dec 15 '16 at 07:10
-
@Akina, спасибо. Vladimir, предлагаю добавить ссылку: https://en.wikipedia.org/wiki/IEEE_floating_point#Basic_and_interchange_formats – Nick Volynkin Dec 15 '16 at 07:56
-
@NickVolynkin, Akina ребзя, речь про питон, у него decimal безразмерный. И в других языках есть подобные фишки (в виде внешних библиотек). Меседж был в том, что один из вариантов - использовать подходящие типы/библиотеки, которые предотвратят потерю точности. – Vladimir Gamalyan Dec 15 '16 at 08:14