Вообще-то методы уменьшения погрешности проходят в ВУЗ'е на вычислительной математике.
Попробуй в калькуляторе Windows прибавить 10000000000000000 к 0,00000000000000001 - получишь 10000000000000000, т. к. дробная часть вылезла за пределы точности представления числа. Также и у тебя "хвосты" чисел при суммировании вылазят за границу точности представления вещественных чисел.
Потому, для минимизации ошибки начинать суммирование чисел одного знака надо от минимальных по абсолютному значению слагаемых и двигаться к максимальным. В твоём случае от 1/1000000^2 до 1/1^2 даст более точный результат, чем от 1/1^2 до 1/1000000^2.
Java
Отличается сумма Почему отличается сумма ряда 1/n^2 при n от 1 до 1000000 и от 1000000 до 1?
Насколько именно отличается?
Если отличие небольшое, оно вызвано порядком накопления ошибок округления.
Если большое - ошибка в программе.
Если отличие небольшое, оно вызвано порядком накопления ошибок округления.
Если большое - ошибка в программе.
Вадим Фоминцев
Да, там отличие в последних числах. А можно поподробнее про накопление погрешности?)
Это особенность вычислений с плавающей точкой, они выполняются с одинаковой относительной, а не абсолютной, точностью. Поэтому если считаем с конца, то мелкие числа в сумме учитываются, если с начала, то нет.
Пример для счета с точностью в один десятичный разряд:
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
Всяким таким занимается вычислительная математика - необходимая часть обучения программиста. Корни квадратного уравнения по тем же причинам в профессиональном программировании во избежание возможной потери точности тоже полагается считать по отличающейся от школьной формуле, и т. п.
Пример для счета с точностью в один десятичный разряд:
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
Всяким таким занимается вычислительная математика - необходимая часть обучения программиста. Корни квадратного уравнения по тем же причинам в профессиональном программировании во избежание возможной потери точности тоже полагается считать по отличающейся от школьной формуле, и т. п.
эти суммы, конечно, не отличаются.
если отличаются в какой-то конкретной программе - то это ошибка, связанная с погрешностью округления либо неверным использованием программы либо с чем-то еще.
если отличаются в какой-то конкретной программе - то это ошибка, связанная с погрешностью округления либо неверным использованием программы либо с чем-то еще.
потому что ряд положено записывать от меньшего до большего. нельзя от 1000000 до 1.
Вадим Фоминцев
Интересен механизм, ведь по логике без разницы от какого числа идти?
Тимур Кульмагамбетов
Почему так? С точки зрения математики, неважно с какой стороны считать.
Тимофей Ходас
Спасибо, похохотал. Очевидно, в институте ты не учился и о методах уменьшения погрешности вычислений ни разу в жизни не слышал.
Похожие вопросы
- Программисты, помогите написать код который будет выводить одно из чисел (от 1 до 2) с разным шансом ( в джава)
- Как работает такой цикл for? for (i=1;i>=n;i--) И для каких N он может использоваться?
- Работа со строками Java Разработать программу, которая вводит строку и находит все слова указанной длины n (n вводится).
- Какие из следующих стандартных контейнеров позволяют найти в них элемент по его значению за O(log(n))?
- Чем Java отличается от JavaScript
- Задача. Есть несколько множеств множеств с числом элементов от 1 до 3 - пересечения возможны. Далее внутри...
- чем отличается структурно процедурное програмирование от обьектно ориентированого?)
- чем отличается перегрузка от переопределения?)
- Чем абстрактный класс отличается от интерфейса?
- Зарплата инженера и программиста у нас отличается в сотни раз, а какая разница в мире между этим специалистами?
Тут дело в том, что последние члены последовательности в этом примере заведомо меньше точности мантиссы для первого члена.
И если идти от меньшего к большему члену, то мы насчитаем сначала какую-то милипиздрическую сумму, которая потом при суммировании перепрыгнет на разряд выше, потом еще выше, потом еще, каждый раз добавля все больше и больше "неважных" для конечного результата сумм.
А вот если идти от большего к меньшему, то эти суммы мы просто похерим - общая сумма перестанет увеличиваться начиная с некоторого члена.