2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Проблемы с суммированием ряда на C
Сообщение23.03.2009, 21:30 
Здравствуйте.

Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char** argv)
{
    int N = atoi(argv[1]);
    double s = 0.0;
    int n;
    for (n = 1; n <= N; n++)
    {
    /* результат другой!! Уже при N = 1000 s оказывается < 0.65!! */
    /* s += (1.8*n + 1.2) / (n*n*n*n + 1.8*n*n*n + 1.2*n*n);
    /**/
        s += (1.8*n + 1.2) / (pow(n, 4) + 1.8*pow(n,3) + 1.2*pow(n,2));
    }
    s = M_PI*M_PI/6.0 - s;
    printf("%.16f", s);
    return 0;
}

Один вариант при компилировании я назвал s1, другой s1_2 и вот что получается на выходе
Код:
D:\>s1 1000
0.6525800476750094
D:\>s1_2 1000
0.6496627497603147

Какому варианту верить больше и почему? Почему получаются разные ответы? Как работает функция pow()?

Может быть, посоветуете в какую сторону смотреть (м.б., книги, ссылки и т.п), чтобы разобраться, что к чему в подобных вопросах?

 
 
 
 
Сообщение23.03.2009, 22:09 
Аватара пользователя
Верить - точному ответу (если он вообще считается), а вариантов-то масса. К слову, можете попробовать считать с конца, типа for (n = N; n >= 1; n--), там получится ещё несколько разных ответов.
Смотреть же в сторону floating-point чисел и особенностей операций с ними.

 
 
 
 
Сообщение23.03.2009, 22:13 
Аватара пользователя
Поскольку расхождение уже при N=1000, я бы посмотрел значения слагаемых при N около 1000 и сравнил бы их с вычисленными с помощью арифметики высокой точности.
Мне кажется, pow менее точен, поскольку мне помнится, что он считается как exp(a*ln(b))

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group