2017-04-09 3 views
0

Ich habe eine Funktion zur Berechnung von Cosinus basierend auf Taylor-Serie, erstellt, nur um ein Genauigkeitsproblem zu begegnen, wenn Sie es mit der Standardbibliothek Cosinus vergleichen. zum Beispiel Rechen 23 meines cos gibt: -0,53283 und die Standard-Bibliothek gibt: -0,53283Präzisions-Issuse mit Taylor-Serie zum Auffinden von Kosinus

Ich habe die Web gesucht, und zu versuchen, es selbst Figur, sondern nur couldn bezeichne das Problem nicht! wenn das treasould 1.0e-7 erhöht wird, ist das Problem gelöst. aber es sollte auch gut für 1.0e-6 funktionieren (wie es für meine Freunde funktionierte)

würde sich über jede Einsicht freuen, danke voraus.

#define PI 3.14159265358979323846264338327950288419716 

double my_cos(double rad){ 

int i = 0; 
double numer = 1, denom = 1;  
double x2, cos = 0;  

rad = fmod(fabs(rad),2*PI); 
x2 = pow(rad,2);  

do{ 
    cos += pow(-1,i)*(numer/denom); 
    i++; 
    numer *= x2; 
    denom *= (2*i)*(2*i-1); 
} while (numer/denom>1.0e-6); 

return cos ; 
} 

Antwort

1

Die Rundung geschieht, wenn Sie printf

Dieser Aufruf wird

printf("%f\n", my_cos(23)); 
printf("%f\n", cos(23)); 

-0.532834 
-0.532833 

drucken, die "falsch" zu sein scheint.

Aber wenn Sie erhöhen die Anzahl der Ziffern drucken wie

printf("%0.12f\n", my_cos(23)); 
printf("%0.12f\n", cos(23)); 

es gedruckt wird

-0.532833931872 
-0.532833020333 

So haben Sie die Präzision, die Sie wollen. Es ist nur der Druck, der es so aussehen lässt, als ob etwas nicht stimmt.

+0

Sir, ich liebe dich. (Ich kann nicht glauben, dass ich so viel Zeit damit verschwendet habe) –

Verwandte Themen