Java

Отличается сумма Почему отличается сумма ряда 1/n^2 при n от 1 до 1000000 и от 1000000 до 1?

Вообще-то методы уменьшения погрешности проходят в ВУЗ'е на вычислительной математике.

Попробуй в калькуляторе Windows прибавить 10000000000000000 к 0,00000000000000001 - получишь 10000000000000000, т. к. дробная часть вылезла за пределы точности представления числа. Также и у тебя "хвосты" чисел при суммировании вылазят за границу точности представления вещественных чисел.

Потому, для минимизации ошибки начинать суммирование чисел одного знака надо от минимальных по абсолютному значению слагаемых и двигаться к максимальным. В твоём случае от 1/1000000^2 до 1/1^2 даст более точный результат, чем от 1/1^2 до 1/1000000^2.
Тимофей Ходас
Тимофей Ходас
79 297
Лучший ответ
Саша Леушин А это не приведет к какой-то системной ошибке округления?
Тут дело в том, что последние члены последовательности в этом примере заведомо меньше точности мантиссы для первого члена.
И если идти от меньшего к большему члену, то мы насчитаем сначала какую-то милипиздрическую сумму, которая потом при суммировании перепрыгнет на разряд выше, потом еще выше, потом еще, каждый раз добавля все больше и больше "неважных" для конечного результата сумм.
А вот если идти от большего к меньшему, то эти суммы мы просто похерим - общая сумма перестанет увеличиваться начиная с некоторого члена.
Насколько именно отличается?
Если отличие небольшое, оно вызвано порядком накопления ошибок округления.
Если большое - ошибка в программе.
Саша Леушин
Саша Леушин
58 152
Вадим Фоминцев Да, там отличие в последних числах. А можно поподробнее про накопление погрешности?)
Это особенность вычислений с плавающей точкой, они выполняются с одинаковой относительной, а не абсолютной, точностью. Поэтому если считаем с конца, то мелкие числа в сумме учитываются, если с начала, то нет.
Пример для счета с точностью в один десятичный разряд:
0.2+0.2+0.2 +0.2+0.2+1=0.4+0.2+0.2+0.2+1=0.6+0.2+0.2+1=0.8+0.2+1=1+1=2
1+0.2+0.2+0.2 +0.2+0.2=1+0.2+0.2+0.2+0.2=1+0.2+0.2+0.2=1+0.2+0.2=1+0.2=1
Всяким таким занимается вычислительная математика - необходимая часть обучения программиста. Корни квадратного уравнения по тем же причинам в профессиональном программировании во избежание возможной потери точности тоже полагается считать по отличающейся от школьной формуле, и т. п.
Abdallahh Ameen
Abdallahh Ameen
87 845
эти суммы, конечно, не отличаются.
если отличаются в какой-то конкретной программе - то это ошибка, связанная с погрешностью округления либо неверным использованием программы либо с чем-то еще.
потому что ряд положено записывать от меньшего до большего. нельзя от 1000000 до 1.
Вадим Фоминцев Интересен механизм, ведь по логике без разницы от какого числа идти?
Тимур Кульмагамбетов Почему так? С точки зрения математики, неважно с какой стороны считать.
Тимофей Ходас Спасибо, похохотал. Очевидно, в институте ты не учился и о методах уменьшения погрешности вычислений ни разу в жизни не слышал.

Похожие вопросы