Rechenfehler: tan & grad?

delphinhawe

Erfahrenes Mitglied
Code:
#include <stdio.h>
#include <math.h>
#define PI 3.14159265

int main ()
{
  float a, b, tanx, Ziel;
  a=3;
  b=6;
  
  tanx = a/b ;
   
  Ziel = atan (tanx) * 180 / PI;
  printf ("%f \n", Ziel );
  //return 0;
}

Code:
#include <stdio.h>
#include <math.h>
#define PI 3.14159265

int main ()
{
  double Ziel, tanx;
  Ziel = 26,56505118;
  tanx = tan (Ziel*PI/180);
  printf ("%lf.\n",tanx);
  //return 0;
}

Hallo!

Beim ersten Zitat stelle ich fest,
daß das Ergebnis bei tanx=3/6=0,5 lautet!

Beim zweiten Zitat stelle ich fest,
daß das Ergebnis bei tanx=0,48733 anstatt 0,5 ungenau ist!

Frage: Was ist da falsch programmiert? Ist das ein Rechenfehler?

delphinhawe
 
Ich glaube das liegt daran das anstatt Grad mit Rad gerechnet wird.
Du musst voher jedes Grad in einen Rad umrechnen lassen.

Das geht so:

2*Pi
------ * Grad
360

Man kann sich ne kleine Funktion schreiben die das übernimmt doch man müsste
für jeden Datentyp eine extra Funktion machen Zwecks Return Wertes.
Darum glaube ich gehts mit #define viel besser.

Code:
#define PI 3.14159265
#define g2r(x) ((2*PI)/360)*x

Verwenden tust du es so:

C++:
//Sollte 1 rauskommen :)
printf( "Sinus von 90 Grad = %f \n", sin( g2r(90) ) );

//Geht auch mit Variablen
float variable = 90;
printf( "Cosinus von 90 Grad = %f \n", cos( g2r(variable) ) );


Ich hoffe ich habs verständlich erklärt.
 
Zuletzt bearbeitet von einem Moderator:
Code:
#include <stdio.h>
#include <math.h>
#define PI 3.14159265
#define g2r(x) ((2*PI)/360)*x

int main ()
{
  double Ziel, tanx;
  Ziel = 26,56505118;
  //tanx = tan (Ziel*PI/180);
  //tanx = tan(Ziel*PI/180);
  //printf ("%lf\n",tanx);
  printf( "Tangens von %fl Grad = %f \n",Ziel, tan( g2r(Ziel) ) );
}

Danke! Ja, ich habe gut verstanden. PI/180° ist gleich wie 2*PI/360°.
Das Ergebnis Deiner Lösung lautet aber: 0,487.... Siehe Code.
Mir ist aufgefallen, dass nach dem Ausführen der Start, wie folgt:

Tangens von 26.0000001 Grad = 0,487733

Für mich bedeutet, dass der Compiler erst den Grad abrunden bzw. auf 26°, dann umgewandelt auf 0,487733.
Nun möchte ich verhindern, dass der Compiler den Grad nicht automatisch abrundet , sondern 26,56505118° soll so bleiben!
Nun mein Versuch die innere Klammer 26,56505118 anstatt Ziel zu ändern. Das hat geklappt.
Es lautet: 0,5
Trotzdem soll die Varible ,,Ziel“ unverändert bleiben und wie kann ich ggf. abrunden verhindern?

Code:
#include <stdio.h>
#include <math.h>
#define PI 3.14159265
#define g2r(x) ((2*PI)/360)*x

int main ()
{
  double Ziel, tanx;
  Ziel = 26,56505118;
  //tanx = tan (Ziel*PI/180);
  //tanx = tan(Ziel*PI/180);
  //printf ("%lf\n",tanx);
  printf( "Tangens von %fl Grad = %f \n",Ziel, tan( g2r(26.56505118) ) );
}
 
Ah Sorry für das Missverständnis...
Hab glaube ich deinen "Rundungsfehler" gefunden.
Bei den meisten Kompilern wird die Amerikanische Kommaschreibweise
benutzt. Also anstatt einem deutschen Komma ein Punkt :)
Dann dürfts gehn.


Code:
#include <stdio.h>
#include <math.h>
#define PI 3.14159265
#define g2r(x) ((2*PI)/360)*x

int main ()
{
  double Ziel;
  Ziel = 26.56505118;
  printf( "Tangens von %.10f Grad = %f \n",Ziel, tan( g2r(26.56505118) ) );
  printf( "Tangens von %.10f Grad = %f \n",Ziel, tan( g2r(Ziel) ) );
  getc(stdin);
}

edit:

lol ^^ 9 Minuten zu spät...
Das kommt davon wenn man zwischendurch mal Manga liest...
dieser beitrag kann gelöscht werden...
 
Zuletzt bearbeitet:
,,Bei den meisten Kompilern wird die Amerikanische Kommaschreibweise benutzt.“
Das wusste ich nicht! Interessant.
Doch, ich wusste, dass Du genau so beantwortest. Schuld ist das Buch, in dem keine Hinweise steht sind.

Beiträge müssen nicht gelöscht werden. Es gibt Leute, die nicht wissen, wie man die Funktionen von math.h in C-Sprache umsetzen kann. Also, ich kann Dir sagen, dass Deine Beiträge wertvoll sind. Vielen Dank!
 
nagut es ist C, da lassen wir den murks per macro und co zu:
C++:
#define PI 3.14159265
#define deg_to_rad(x) (PI / 180.0) * x
aber bitte dann doch ;) Kann dir sonst passieren das er mit Integer rechnet ... gibt sehr ungenaue Ergebnisse!
 
Soweit ich das verstanden hab rechnet er immer mit dem genaustem Datentyp.
Also bei float auch die Kommastellen und bei Intenger brauchts ja net weiter zu
kümmern... oder hab ich da was falsch verstanden :confused:
Ah, da, habs gefunden...

"Beachten Sie im Zusammenhang mit Gleitpunktzahlen auch Folgendes: Wenn Sie zwei
verschiedene Variablen, z.B. int und float, miteinander durch Operatoren verknüpfen,
erhalten Sie das Ergebnis vom genaueren Datentyp dieser beiden Variablen zurück."

Quelle: http://www.galileo-press.de/openbook/c_von_a_bis_z/c_007_005.htm#RxxobKap0070050400263A1F01218C

Aber trotzdem danke für den Tipp, werde ich mir merken falls was doch nicht stimmt :)
 
Zuletzt bearbeitet:
Zurück