010
08.03.2004, 22:23 Uhr
Pablo
Supertux (Operator)
|
Das mit dem EPSILON sollte etwas generisches sein. Wie ich schon sagte, wenn man mit double oder floats arbeitet und auf Gleichheit überprüfen soll, sollte man nicht mit == überprüfen, denn Rundungsfehlern immer vorhanden sind.
Um 2 float miteinander auf Gleichheit vergleichen zu können, sollte man eine Schranke setzen, das mache ich mit dem EPSILON. Stell dir vor a und b sollen die Zahl 3.444 darstellen. a == b genau dann, wenn b um eine kleine Schranke von a abweicht, z.b. 3.444 und 3.4440001 kann man schon al gleiche Zahlen interpretieren. Mathematisch ausgedrückt, wenn |a-b|<Konstante, die Größer als 0 sein soll. Die Funktion fabs leifert den Absolutbetrag einer Zahl, deren Typ Float ist. Meine Schranke ist EPSILON, deshlab return fabs(x-y)<EPSILON, in anderen Worten, liefere TRUE zurück, wenn x von y um höchstens EPSILON abweicht.
Natürlich kann passieren, dass man tatsächlich mit == das richtige bekommt, wenn es keine Rundensfehler gibt. Aber man sollte lieber auf Nummer sicher gehen und die Floats auf meine vorgeschlagene Art und Weise überprüfen.
#define ist ein MAKRO und sagt dem Compiler: Ersetze alle Vorkommen von EPSILON durch .0001. Ja, das mit const könnte man auch so machen. Wie du das in deinem Programm hinzufügst? Einfach Copy & Paste machen und benutzen.
Meine Frage an dieser Stelle wäre: Wenn du in a und b entweder 1 oder 2 speichern willst, wieso nimmst du denn float und nicht int????
Ich hab schon gesagt, wenn man using namespaces std; benutzt, braucht man std:: vor cout und endl; gar nicht. Das ist eben der Sinn der using Anweisung Aber man kann es trotzdem tun.
ich dachte, dass mit den if-else Block wäre schon gelöst. Was ist nun das Problem? -- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! Dieser Post wurde am 08.03.2004 um 22:24 Uhr von Pablo editiert. |