2892. Сумма значений

 

Найдите сумму значений функции

в нескольких целых точках.

 

Вход. В первой строке задано количество точек n (1 ≤ n ≤ 50). В следующей строке заданы n целых чисел x1, x2, ..., xn через пробел – точки, значения функции в которых нужно просуммировать (0 ≤ |xi| ≤ 109).

 

Выход. Выведите одно число – сумму значений функции f(x) в заданных точках. Ответ считается правильным, если абсолютная или относительная погрешность не превышает 10-9.

 

Пример входа

Пример выхода

3

1 2 3

7.83333333333333

 

 

РЕШЕНИЕ

математика - вычисления

 

Анализ алгоритма

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

 

double y = 1000000000 + 1.0 / 1000000000;

 

равно 1000000000 (дробная часть не помещается в double). В то же время значение

 

double y = 1.0 / 1000000000;

 

равно 1e-9.

Для минимизации ошибок округления при вычислениях будем считать целую и дробную части суммы отдельно в разных переменных.

 

Реализация алгоритма

Целую часть суммы подсчитываем в переменной sum1, а дробную в sum2.

 

scanf ("%d", &n);

sum1 = sum2 = 0;

for (i = 0; i < n; i++)

{

  scanf ("%lf", &x);

  sum1 += x;

  sum2 += 1.0 / x;

}

 

Выводим искомый результат как сумму двух переменных.

 

printf ("%.12lf\n", sum1 + sum2);