Dezimalbruch wird falsch berechnet
-
Hallo,
bin dabei einige Programmieraufgaben für die Uni zu lösen.
Ich habe ein Problem und zwar sollen wir mittels Bisektionsverfahren Nullstellen verschiedener Funktionen berechnen. Soweit auch alles nicht dramatisch.
Nur gibt es eine Funktion 1/7 + 1/x und genau die ist das Problem.
C rechnet wenn x=-7.75 ist die Funktion aus und gibt dann per return -0.129.... zurück. Das ist aber falsch! 1/-7.75 = -0.129 aber warum zählt er mir da 1/7 nicht mehr dazu?Habs mal selbstständig laufen lassen, damit ich sehe ob an meiner Funktion was nicht stimmt... Aber wenn man
printf("%f",(1/7 - 1/7.75);
schreibt kommt auch -0.129... dabei raus.
Ich glaub ich häng, es müsste ein positiver Wert rauskommen um ans richtige Ergebnis zu kommen...
Weiß einer von euch evtl. warum?
Lg
Alex
-
Benutz 1/7.0 oder (float)1/7
-
tatsächlich, danke.
Komisches Ding, muss ich mir merken... THX!
-
nix komisch, das hat alles seine richtigkeit
es ist halt ein Unterschied Ganzzahlen oder Gleitkommazahlen zu teilen. Aber ja hast Recht solltest du dir merkenschirrmie
-
ja ist mir klar das die Genauigkeit anders ist. Dachte allerdings das wenn der Compiler double x = 7; liest automatisch 7.0 in Maschinencode umsetzt... Anscheinend nicht der Fall und das find ich komisch
-
Alex04 schrieb:
ja ist mir klar das die Genauigkeit anders ist. Dachte allerdings das wenn der Compiler double x = 7; liest automatisch 7.0 in Maschinencode umsetzt... Anscheinend nicht der Fall und das find ich komisch
ich fände es komisch, wenn alles per default mit den langsamen und ungenauen floats/doubles berechnet würde.
-
Bei dem Ausdruck "1/7 + 1/x" berechnet schon der Compiler den konstanten Ausdruck "1/7" als die Division zweier ganzen Zahlen (und da kommt dann 0 raus, und da die Addition von 0 nichts bringt, wird sogar dies wegoptimiert, so daß im Endeffekt nur Code für "1/x" erzeugt wird (und dabei wird jetzt aus der 1 eine 1.0, da x ein double-Wert ist).