Forum: PC-Programmierung C++ x/cos(.)


von Arschgwaf (Gast)


Lesenswert?

Hallo,

Wie bekannt gilt: cos(a) = AnKat/Hyp. In meinem mir vorliegenden Prog. 
soll nun die Hypotenuse berechnet werden. Der Prog. hat das so gemacht:

fHyp = fAnKat/cos(fa*PI/180);

Ich denk mir natürlich 0h Gott div 0 für Winkel 90°. weil dann fKat = 0 
und cos = 0.

Das für mich verwunderliche:
Es funktioniert. Und es kommt sogar für fHyp der richtige Wert raus, 
also Hyp = GegenKat.

Liegt das daran, dass durch die Gleitkommarechnung cos(90°) vermutlich 
nicht 0 sonder etwas sehr sehr kleines aber nicht 0 ergibt? (und fAnKat 
ebenso?)

von Mark B. (markbrandis)


Lesenswert?

1
float a = 1.0 / 0.0;
2
printf("a = %f\n", a);

a = 1.#INF00

von Arschgwaf (Gast)


Lesenswert?

Also org. Code berechnet sich:

#define PI 3.14159265358979323846

fAnKat = fGegenKat/tan(fa*PI/180);

fHyp = fAnKat/cos(fa*PI/180);


fGegenKat und fa sind Usereingaben.
Für fa = 90 ergibt sich dann fHyp = fGegenKat, obwohl ja schon fAnkat = 
0 geben müsste. Ich hab das ganze abgefangen:

if(((fa-90)%180)==0){
fAnKat = 0;
fHyp = fGegenKat;
}

Trotzdem interessiert mich warum der obere Code funktioniert!

von Robert L. (lrlr)


Lesenswert?

>cos(90°) vermutlich
>nicht 0

doch das ist schon 0


>fa*PI/180

DAS ist nicht (genau) 90°

(vermutlich)

von Frank M. (aktenasche)


Lesenswert?

winkel in grad und pi vermischt? klingt nach bullshit.

von Arschgwaf (Gast)


Lesenswert?

Hi,

lange nicht geschrieben, war im Urlaub.

Die Mischung kommt daher, dass die Winkel als float in Grad übergeben 
werden, in der Funktion jedoch alels im Bogenmaß gerechnet wird. Das 
*PI/180 ist einfach die Umrechnung Grad -> Bogenmaß.

@Robert:
Im Debug Modus sehe ich, dass ich keinen divide by 0 bekomme, weil für 
den cos nicht genau 0 raus kommt.
Der Wert der am Ende für cos rauskommt müsste aber ja Ausdruck der float 
Ungenauigkeit sein und damit unabhängig von der ursprünglichen Rechnung.
Gleiches gilt für den Wert von fAnKat der auch nicht genau 0 wird 
sondern nur dem float Rechenfehler entspricht.

Warum ergibt dann aber Float-Ungenauigkeit1/Float-Ungenauigkeit2 = 
richtiges Ergebnis? Das wird mir nicht klar.

von Karl H. (kbuchegg)


Lesenswert?

Arschgwaf schrieb:
> Hi,
>
> lange nicht geschrieben, war im Urlaub.
>
> Die Mischung kommt daher, dass die Winkel als float in Grad übergeben
> werden, in der Funktion jedoch alels im Bogenmaß gerechnet wird. Das
> *PI/180 ist einfach die Umrechnung Grad -> Bogenmaß.

Das ist schon allen klar.

Klar ist aber auch, dass bei der Umrechnung 90° -> PI/2 eben nicht 
mathematisch exakt PI/" rauskommen wird, sondern es eine Abweichung in 
der (keine Ahnung) 12.ten oder 13.ten oder 14.ten Nachkommastelle geben 
wird.


> Warum ergibt dann aber Float-Ungenauigkeit1/Float-Ungenauigkeit2 =
> richtiges Ergebnis?

langsam.
Wieviele Nachkommastellen hast du dir angesehen?

Alleine durch das übliche Runden bei der Ausgabe auf 5 oder 6 
Nachkommastellen, verstecken sich Rundungs bzw. Rechenungenauigkeiten in 
der 13.ten oder 14.ten Nachkommastelle (also gaaaaaaaanz hinten).

von Johannes E. (cpt_nemo)


Lesenswert?

Arschgwaf schrieb:
> Warum ergibt dann aber Float-Ungenauigkeit1/Float-Ungenauigkeit2 =
> richtiges Ergebnis? Das wird mir nicht klar.

Du berechnest zwei mal "fa*PI/180", das ergibt jedes mal den gleichen 
Fehler.

Mit fa=90.0 ist der Ausdruck ungefähr Pi/2, aber nur ungefähr. Dadurch 
funktioniert die weitere Rechnung fehlerfrei.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.