2015-09-29 2 views
0

Привет, ребята, я делаю дополнительную кредитную программу, и я ее запускаю, но каждый вход, который я использую, всегда заканчивается, чтобы быть 1. Может ли кто-нибудь указать мне в правильном направлении, где я испортил пожалуйста и спасибоНужна помощь в понимании Math в C++

#include<stdio.h> 
#include<math.h> 
#define Euler 2.718282 
#define Pi 3.141593 

int main(void) 
{ 
    int n; 
    int n_fact(int n); 

    printf("Enter n: "); 
    scanf_s("%d", &n); 

    while (n < 0) 
    { 
     printf("The n value must not be negative"); 

     printf("Enter the value of n: "); 
     scanf_s("%d", &n); 
    } 
    printf("n! Stirling approximation value about %i is %i ", n, n_fact(n)); 

    getchar(); 
    getchar(); 
    return 0; 


} 


int n_fact(int n) 
{ 
    if (n == 0) 
    { 
     return 0; 
    } 
    else 
    { 
     return (int)(1 + 1/(12 * Euler) + 1/(288 * n*n) - 139/(51840 * n*n*n)); 
    } 
} 
+0

Ваша формула неправильная. Это всегда будет оцениваться до 1,0306 плюс/минус что-то маленькое -> усечение даст 1. –

+0

@PaulR, поэтому мне нужно было бы изменить int n_fact (int n) на float n_fact (int n)? – Failingengineer

ответ

2

Вы испытываете проблемы здесь из-за целочисленной арифметике, в частности, целочисленное деление:

return (int)(1 + 1/(12 * Euler) + 1/(288 * n*n) - 139/(51840 * n*n*n)); 

Вы также пропустили важную часть the formula, так что даже с точки разделения плавающей выше выражения все равно не вернет правильное значение.

Посмотрите на серии снова:

enter image description here

Для того, чтобы оценить это вы будете нуждаться, чтобы (а) использовать с плавающей точкой во всем и (б) вам необходимо включить sqrt(2 * pi * n) * pow(n/e, n) тоже. Однако вы можете опустить все, кроме первых нескольких членов серии, в зависимости от требуемой точности (очевидно, ваше задание требует, чтобы вы использовали первые четыре условия).

+0

@BaummitAugen: вы правы - OP пропустил целый кусок формулы. –

+0

@PaulR. Приведенная формула, которую мы должны использовать, - это [1 + 1/(12 * n) + 1/(288 * n^2) -139/(51840 * n^3)], поэтому единственное, что я сделал, using pow did n * n ect – Failingengineer

+0

Вам нужен термин 'sqrt (2 * pi * n) * pow (n/e, n)', иначе вы получите очень маленькие цифры. –

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