2016-03-17 11 views
1

Это вопрос домашней работы, который я недавно пересмотрел. Это требует от меня не использовать cmath и записывает функцию для оценки cos pi/3. КодПочему for-loop ведет себя по-разному при подсчете против счета?

#include <iostream> 
using namespace std; 

double power(double x, int b) { 
    if (b>1) return x*power(x,b-1); 
    else if (b==0) return 1; 
    else return x; 
} 

double cosine(double x, int k) { 
    double tmp=0; 
    for (int n=0; n<=k; n++) { 
     tmp += power(-1,n)/factorial(2*n) * power(x,2*n); 
    } 
    return tmp; 
} 

int main() { 
    double x=3.1415/3; 
    int k=100; 
    cout << cosine(x,k) << endl; 
} 

Я написал две версии double factorial(int a) с для петель.

Один подсчитывает и успешно выводит 0.500027:

double factorial(int a) { 
    double tmp=1; 
    for (int i=1; i<=a; i++) { 
     tmp*=i; 
    } 
    return tmp; 
} 

Другой отсчитывает и выходы inf (но успешно оценивают 4 = 24!):

double factorial(int a) { 
    double tmp=a; 
    for (int i=a; i>=1; i--) { 
     tmp*=i; 
    } 
    return tmp; 
} 

Почему отсчет петля не дает сходящийся выход?

ответ

1

Второй factorial() умножает a в два раза. Попробуйте это:

double factorial(int a) { 
    double tmp=1; // use 1 instead of a 
    for (int i=a; i>=1; i--) { 
     tmp*=i; 
    } 
    return tmp; 
} 

Обратите внимание, что с помощью double tmp=a; и инициализации i в a-1 не хорошо, потому что он будет делать factorial(0) = 0, в то время как factorial(0) должно быть 1.

Первая реализация также умножает 1 в два раза, но умножив 1 Безразлично Не влияет на результат.

+0

Работает для 'double tmp = 1;', но все же 'inf' для' int i = a-1'. Зачем? – user2513881

+0

@ user2513881 Попробуйте проверить 'factorial()' без использования 'cosine()'. – MikeCAT

+0

'factorial (10)' дает 3.6288e + 06. Но да, 'factorial (0)' является проблемой и вызывает «деление на ноль», когда n = 0 в for-loop 'cosine (x, k)'. – user2513881