mit float Werten arbeiten (rechnen)
-
Die Ganzzahl bekommst du so:
int gzz = int(fliess);
Die Nachkommastellen so:
int nks = int(fliess - ganz * pow(stellen, 10));
Dürfte eigentlich funzen
-
Vielleicht versuche ich nochmal meine Frage/Problematik neu darzustellen.
Ich programmiere eine Koordinatensystem, welche nur den von Benutzer vorgegebenen Bereich darstellt. Daß heißt: Wenn der Benutzer vorgibt, daß die
y-Achse von 0.34 bis 0.87 'gehen' soll mit einem Delta von 0.05, dann stellt sich die y-Achse dementsprechend ein.
Hierzu muß ich natürlich einige vernünftige Anfangs und Endwerte finden. Deshalb habe ich einige Schleifen, wo Abbruchbedingungen mit
Operationen wie < > == != usw. vorhanden sind!
Gerade diese Operationen funktionieren aber mit float Werten nicht zuverlässig!! Man sagt auch: Vergleiche NIE 2 float Werte !!
Deshalb meine Frage : Wie kann ich float-Werte am besten handhaben ??
Was ist zu tun, wenn man in seinen Progi
Vergleichsoperationen hat ??Ich dachte schon daran alles in Ganze-Zahlen umzuwandeln. Mein Betreuer war davon aber nicht begeistert.
Viele Grüße an alle Programmers !! bolilein
-
entweder du definierst dir ein epsilon fuer das gleichheit gilt, also
const double epsilon = 0.001;
double d = 0.8;
double d2 = irgendwas;if ( abs( d - d2 ) < epsilon )
zahlen gleich
else
zahlen ungleichoder du rechnest gleich mit ganzzahlen.
-
Danke danke !
Gefällt mir!! Ich möchte sowieso höchstens 3 Stellen hinter den Komma berücksichtigen.Ich glaube DAS bringt mich weiter!!
CIAO und bis zu nächste Frage bolilein
-
Ja da bin ich wieder. :p
Was jetzt anliegt ist klar.
Wenn ich in meine Schleifen float-Werte aufsummiere,so fange ich mir auch immer mehr Fehler ein.
Das heißt irgendwann überschreiten meine Rechnungen durchaus den definiertenconst double epsilon = 0.001;
Und so kann ich wieder nicht vernünftig auf Gleichheit prüfen.Nun bin ich ratlos, wie ich mit sowas fertig werde ?!
Soll ich versuchen lange Summationen zu vermeiden ??
Ich denke das kann es nicht sein.
Muß ich je nach Zahlenbereich(sprich je nach geforderten Genauigkeit) unterschiedliche Epsilon festlegen?
Das kann es doch auch nicht sein.Hoffe entelechie, daß du mir wieder einen guten Tipp hast.
Danke dir/euch Grüzzi von bolilein
-
Wenn Du wirklich hohe Genauigkeit brauchst kannste als allererstes mal auf double umstellen. Für 3 Stellen nach dem Komma sollte das eigentlich lagen.
leider ist es tatsächlich so, daß die Genauigkeit je nach Rechenoperation schwankt. Besonders große und besonders kleine Zahlen zu addieren ist nicht wirklich günstig.
Aber wenn Du Dein Koordinatensystem in einem vernünftigen Bereich (sagen wir +-100, 3 Nachkommastellen) bearbeitest sollten doubles eigentlich nahezu jeder Rechenoperation standhalten. Ansonsten mußte halt wirklich auf Brüche umsteigen.Achja, mit der Ganzzahl / Nachkommazahl ist natürlich nicht so geschickt, weil Du da genau wieder das Problem hast, daß Du periodische Zahlen nicht darstellen kannst.
-
Oh jeh !
Das wird dann interessant sein.
Der X-Achse soll nämlich Frequenzen darstellen und da gibt es durchaus hohe Werte.Also 1000 Einheiten für die X-Achse muß ich mindestens haben, selbst wenn ich dann die Achse, wenn hohe Werte vorliegen jeweils mit Kilo Mega und Giga (Terra) beschrifte. Denn zwischen diese Werten liegt ja bekanntlich immer der Faktor 1000.Ich probier weiter.
Jester sagte vorhin, die Addition wäre kritisch bei zu kleinen oder zu großen Werten. Wie ist das mit der Multiplikation ?? Ist da auch derselbe Effekt ??
Bin wirklich überrascht wieviele Probleme das Rechnen mit float Werten macht! Es muß aber irgendwie doch gehen! Bin ja nicht der erste der ein Koordinatensystem programmiert.
Für Tipps jeder Art , weiterhin Vielen Dank bolilein
-
Nein, nicht die Addition von zu kleinen/zu großen Werten ist kritisch (okay, allzu groß/klein dürfen sie auch nicht sein), insbesondere die Addition einer sehr kleinen Zahl zu einer sehr großen (und umgekehrt ist kritisch).
Wenn Du große Zahlen mit vielen Nachkommatstellen hast, dann ist auch die Multiplikation kritisch, überhaupt viele Nachkommastellen kann kritisch werden.
An Deiner Stelle würd ich's aber einfach mal mit double probieren,und twar so:
typedef double ValueType;
und dann nur mit ValueType arbeiten. Dann testest Du, ob es Deinen Anforderungen genügt, falls nicht kannste mal gegen long double oder ne Rational-Klasse tauschen, oder sogar noch was anderes, aber es ist gut möglich, daß Dir doubles vollkommen ausreichen.
-
Halllooo
Ich wollte mich nur nochmal bedanken !!
Bis jetzt funktioniert es mit double Werten GUT !
CIAO bis zur nächsten Frage bolilein
-
Original erstellt von Jester:
Für 3 Stellen nach dem Komma sollte das eigentlich lagen.Ne, für 3 Stellen würde ich eher ein long double nehmen