C++ x/cos(.)

Gast #3032169
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?)
Gast #3034085
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!
Gast #3055505
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.
#3055528
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren