Как построить связь между любой ошибкой и точным решением проблемы, связанной с суммированием действительного числа - PullRequest
0 голосов
/ 18 февраля 2020

Я беру класс численных методов, и нам задали эту проблему. Проблема заключается в следующем:

Добавьте действительное число 10 ^ -N к себе 10 ^ N раз. Запустите программу от N = 1 до 12. Итак, я написал следующий код C ++

#include <iostream>
#include <cmath>        // std::pow for power of numbers
#include <iomanip>      // std::setprecision
using namespace std;

int main(){
double i, sum, Nx; // Initialize the variables

for(i = 1; i < 3; i++ ){

Nx = pow(10,i); // Here Nx is the 10^n term.

cout << "Nx: " << Nx << endl;  // Printing Nx before starting the loop

sum = 0;  // Initializing the Total sum to zero

while(Nx){
     sum = sum + pow(10,-i); // Adds every 1/10^i term to itself till 10^i becomes 0.
     Nx--;
     cout << "For i = " << i << " the sum is: " << setprecision(10) << sum << endl; // Printing the summation value
  }
 }
return 0;
}

Суммирование равно 1.

Но вторая часть вопроса - это построение отношений между любой ошибкой и точным решением осмысленным образом.

Я понял, что мне нужен масштаб журнала для его построения. Но как мне сгенерировать ошибку? Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 18 февраля 2020

Число dx=10^-N само по себе имеет ошибку округления в двоичном представлении не более половины ULP, или около 0.5*mu*dx, где mu=2^-52, что составляет около 2e-16. Сумма этих ошибок не более 0.5*mu, поэтому не влияет на результат.

Давайте посмотрим на этапы суммирования. Сначала сумма мала, поэтому ошибка округления будет небольшой. С увеличением суммы погрешность однократного сложения также будет увеличиваться. На полпути суммирования встречаются средние значения крайностей, поэтому посмотрите на добавление от dx=10^-N до 0.5. Снова добавление имеет ошибку округления не более половины ULP, но теперь это относительно результата, который снова около 0.5, что дает ошибку 0.25*mu. Принимая это как среднюю ошибку, все вычисления дадут ошибку около 10^N*0.25*mu, что составляет около 0.5*10^(N-16). Это означает, что последние цифры N являются «грязными». Обратите внимание, что ошибки округления имеют несколько случайное распределение по размеру и направлению, поэтому они также могут быть отменены, что дает меньшую ошибку в конце, чем эта оценка.

В случаях, которые вы наблюдали, ошибка будет в последние 3 из 16 цифр. Округляя до 10 цифр, вы устраняете эту ошибку в напечатанных числах. Вы можете сделать две вещи:

  • увеличить количество цифр в выводе,
  • вывести также разницу до 1.
...