1

Подскажите пожалуйста как компьютер суммирует плохо сходящиеся ряды. У него конечная точность вычислений, и если прибавлять члены которые много меньше текущей суммы ряда, то точности может не хватить. Т.е. компьютер не сможет прибавить одну миллиардную к сумме членов которую он уже посчитал. И при дальнейшем суммировании будет выдавать один и тот же результат.

2 Answers2

2

Для "плохо сходящихся" рядов нужно использовать специальные алгоритмы расчёта.

Простейший алгоритм - это расчёт суммы блоков элементов и последующее суммирование сумм этих блоков. Размер блока выбирается так, чтобы при расчёте его суммы потери точности были минимальны (например, начинать новый блок, когда порядок очередного члена уменьшится по сравнению с предыдущим). Хорошо работает для монотонных рядов, но плохо для знакопеременных, для которых этот алгоритм модифицируют, считая отдельно блоки чётных и нечётных элементов.

Само собой суммирование сумм блоков выполняют от меньших к бОльшим.

Akina
  • 31,807
1

Если стоит задача не потерять точность, то следует использовать соответствующие типы/библиотеки. Например для python точность для Decimal ограничена только оперативной памятью (по умолчанию 28 знаков):

from decimal import Decimal

s = Decimal(0)
s += Decimal(100000000000000)
s += Decimal(0.0000000000001)
print (s)

100000000000000.0000000000001

Живой пример.

  • насчёт цены на память: знакомые занимаются моделированием океанов, там в ходу умножение кубических матриц порядка 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