2015-11-01 5 views
0

Я пытаюсь написать код C для расчета точной аппроксимации Стирлинга от 1 до 12.Стирлинга в языке Си

Вот мой код:

#define PI 3.1416 
#define EULERNUM 2.71828 

float stirling_approximation(int n) { 
    int fact; 
    float stirling, ans; 

    fact = factorial(n); 
    stirling = sqrt(2.0*PI*n) * pow(n/EULERNUM, n); 
    ans = fact/stirling; 

    return ans; 
} 

int factorial(int input) { 
    int i; 
    int ans = 0; 

    for (i = 1; i <= input; i++) 
     ans += i; 
    return ans; 
} 

int main(void) { 
    int n; 
    printf(" n\t Ratio\n"); 
    for (n = 1; n <= 12; n++) { 
     printf("n: %2d\t %f\n", n, stirling_approximation(n)); 
    } 

    return 0; 
} 

Я получаю рекурсивный расчет правильно, но значение метода приближения Стирлинга уходит. И что еще более озадачивает ответы на n = 1, 3 правильно.

Я думаю, что это как-то связано с вызовом функции аппроксимации от основной функции. Я знаю, что это должна быть такая простая ошибка, но я пытался исправить это в течение всего дня! Может ли кто-нибудь помочь мне?

Спасибо!

+0

Вы можете использовать #include и использовать M_PI вместо приблизительно pi –

+0

@SvenBorden: 'M_PI' является нестандартным. – Olaf

ответ

1

Вы неправильно реализован факториал методу

int factorial(int input) { 
    int i; 
    int ans = 0; 

    for (i = 1; i <= input; i++) 
     ans += i; 
    return ans; 
} 

Это должно быть

int factorial(int input) { 
    int i; 
    int ans = 1; 

    for (i = 2; i <= input; i++) 
     ans *= i; 
    return ans; 
} 

Я хотел бы также изменить возвращаемое значение из int в long int.

+0

Ничего себе, очень глупая ошибка. Так что это был мой рекурсивный расчет, а не расчет! Большое спасибо :) – hollaholl

+0

@hollaholl Добро пожаловать! –

Смежные вопросы