2016-09-08 3 views
-1

Guten Abend, ich versuche, den Kosinus zu berechnen, aber ich weiß nicht, wo ich falsch liege. Die Ergebnisse sind ungenau und mit falschem Vorzeichen (-0,54 anstelle von 0,5 für einen 60-Grad-Winkel), selbst wenn die eingegebene Annäherung sehr hoch ist (d. H. 0,000001); Für einen Winkel von 30 Grad wird kein Ergebnis angezeigt, aber der Code läuft noch (ich denke, die While-Schleife endet nicht).Kosinus berechnen in C++ mit Taylor-Serie und Näherungseingabe

#include <iostream> 
#include <cmath> 
using namespace std; 
double fact (int); 
double eps; 
double PI=3.141592654; 
double fact (int num){ 
if (num==0 || num==1) 
    return 1; 
else 
    return num*fact(num-1); 
} 
int main(){ 
double deg; 
    double rad; 
    double term=0.0; 
    double sum=0.0; 
    double cosine=0.0; 
    int i=1; 
    cout<<"You have chosen to calculate the cosine. Insert degrees of the desired angle: \n"; 
    cin>>deg; 
    rad=(PI/180)*deg; 
    cout<<"Value from the c++ library is: \n"<<cos(rad); 
    cout<<"\nProceeding to cosine calculation, insert desired approximation here: \n"; 
    cin>>eps; 
    while ((cos(rad)-fabs(cosine))>eps){ 
    term=pow(rad,2*i)*((pow(-1.0,i))/fact(2*i)); 
    sum+=term; 
    i++; 
    cosine=sum; 
    } 
    cout<<"Value of cosine is: "<<cosine; 
} 

Was könnte ich tun, um diese Fehler zu korrigieren? Danke im Voraus.

+0

Sie sollten 'M_PI' anstelle von PI selbst verwenden. – Chris

+1

Willkommen bei Stack Overflow! Es klingt, als müssten Sie lernen, wie Sie mit einem Debugger Ihren Code durchgehen. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht. Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: ** [Wie kleine Programme zu debuggen] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

+0

Erfahren Sie, wie Sie einen Debugger und Schritt verwenden durch den Code Zeile für Zeile während der Überwachung der Variablen und ihrer Werte. –

Antwort

1

Ich denke, Ihr Fehler liegt hier:

while ((cos(rad)-fabs(cosine))>eps){ 

Wahrscheinlich sollte es

while (fabs(cos(rad)-cosine)>eps){ 

Aber in Wirklichkeit Präzision Menschen zwischen aktuellen und früheren Annäherungen verwenden Unterschied bestimmten.

+1

Ich denke, dein letzter Satz verdient mehr Nachdruck. So wie es aussieht, hängt sein Code davon ab, dass er den korrekten Wert bereits kennt, um den richtigen Wert zu berechnen, der im Allgemeinen ziemlich nutzlos ist. Für den praktischen Gebrauch müssen Sie in der Lage sein, einen Wert zu berechnen, ohne bereits die richtige Antwort zu kennen. –

+0

Danke für die Antwort: in diesem Fall könnte ich zum Beispiel den absoluten Wert des n-Term verwenden, um die Wiederholung zu stoppen (IE While (fabs (sen (rad))> eps) Wie auch immer, ich musste Code schreiben Code: – Fr52

+0

Haftungsausschluss: Ich habe numerische Analyse vor mehr als 5 Jahren gelernt und verwende sie nicht bei der Arbeit. @ Fr52 'eps' ist erforderlich Genauigkeit des Ergebnisses: Per Definition ist es '| x - x * | magras

Verwandte Themen