mehrere if-anweisungen



  • Christian211 schrieb:

    StrToFloat erwartet ein Punkt als Decimalseperator.
    Suche und Ersetze das Komma

    Nicht ganz richtig. Je nach Region wird DecimalSeperator unterschiedlich gesetzt und verarbeitet in der VCL...



  • hast du schonmal überprüft, was für ein wert in der "erhalt"-Variable steht?

    mfg
    BigNeal



  • float-Werte NIE mit == vergleichen

    Aufgrund des internen Formats von Dezimahlzahlen sind viele Dezimalzahlen nicht exakt darstellbar. Das führt dazu, daß == nicht funktioniert.
    Deshalb muß man bei Floatwertüberprüfungen immer prüfen ob der Vergleichswert in einem bestimmten Intervall(die gewünschte Genauigkeit) liegt, sonst fällt man heftig auf die Nase.



  • MichelRT schrieb:

    float-Werte NIE mit == vergleichen

    *malneugierigsein*
    mit was soll man den sonst vergleichen?

    mfg
    BigNeal



  • siehe Edit meiner ursprünglichen Antwort



  • Man könnte sich eine Funktion schaffen, welche zwei float (oder double) Werte im Rahmen einer bestimmten Genauigkeit vergleicht.
    Da Gleitkommazahlen nie vollständig genau im Computer abgebildet werden, können schonmal zwei gleich erscheinende Zahlen beim Vergleich mit == false ergeben. Dazu gabs auch im C++-Forum schon ausfühliche Diskussionen.



  • Oder man kann auch CompareValue() verwenden.

    Gruß,

    Alexander



  • sofern man den BCB6 hat. Ich hab noch den BCB5 und da gibt es diese Funktion nicht.



  • oder man vergleicht mit gerundeten Werten, in diesem Fall Rundung auf eine Dezimalstelle.

    RoundTo(nWert,-1)
    


  • caspar_louis schrieb:

    oder man vergleicht mit gerundeten Werten, in diesem Fall Rundung auf eine Dezimalstelle.

    RoundTo(nWert,-1)
    

    *autsch* 👎



  • caspar_louis schrieb:

    oder man vergleicht mit gerundeten Werten, in diesem Fall Rundung auf eine Dezimalstelle.

    RoundTo(nWert,-1)
    

    Setzen 6



  • MichelRT schrieb:

    caspar_louis schrieb:

    oder man vergleicht mit gerundeten Werten, in diesem Fall Rundung auf eine Dezimalstelle.

    RoundTo(nWert,-1)
    

    Setzen 6

    Drück ich mich so verkehrt aus, oder denke ich so schief? 😕

    if (erhalt==3,3) || (erhalt==3,6) 
    {...} 
    // könnte schief gehen, weil Float-Wert erhalt so ggf. nicht mit 3,3 oder 3,6 [ob mit Komma oder Punkt] nicht gleich sind
    
    if (RoundTo(erhalt,-1)==3,3) || (RoundTo(erhalt,-1)==3,6)
    // sollte das Problem der Ungenauigkeit beheben, da ein Rundungsfehler weitgehend ausgeschlossen werden kann. erhalt wurde ja vorher eingeben, m.E. mit einer Dezimalstelle 
    {...}
    


  • Du denkst schief 😉
    Du vergleichst wieder Fließkommazahlen. Das funktioniert aber nicht.
    0,1 z.B. ist in der internen Fließkommadarstellung (Exponent/Mantisse) eine undendliche Periode und somit nicht darstellbar und somit auch nicht per == vergleichbar.
    Fließkommazahlen dürfen grundsätzlich NIE mit == verglichen werden.



  • MichelRT schrieb:

    Du vergleichst wieder Fließkommazahlen. Das funktioniert aber nicht.
    0,1 z.B. ist in der internen Fließkommadarstellung (Exponent/Mantisse) eine undendliche Periode und somit nicht darstellbar und somit auch nicht per == vergleichbar.

    Das ist mir klar.
    Ich dachte nur, ich sorge dafür daß beide Fließkommazahlen gleich sind. Z.B. 0,1 und 0,1 sollten doch jeweils die identische Fließkommadarstellung nach sich ziehen. Oder ist dort ein Teil zufällig ?

    Ich erinnere mich dunkel an meinen C++ Dozenten, der sagte, daß die Genauigkeit der beiden Werte übereinstimmen müsse, um einen == Vergleich zu ermöglichen. Stimmt das - oder habe ich mir das was falsches gemerkt ?



  • Die Genauigkeit ist der Knackpunkt, das hast Du Dir Richtig gemerkt.
    Z1 und Z2 sind mit der Genauigkeit X als gleich anzusehen wenn
    Z1 < Z2 + X UND Z1 > Z2 - X



  • MichelRT schrieb:

    Die Genauigkeit ist der Knackpunkt, das hast Du Dir Richtig gemerkt.
    Z1 und Z2 sind mit der Genauigkeit X als gleich anzusehen wenn
    Z1 < Z2 + X UND Z1 > Z2 - X

    ?!?
    Die Genauigkeit eines Dezimalwertes gibt die Stellen nach dem Komma an, die nicht Null sind.

    z.B. Genauigkeit=3 -> 2/3=0,3330

    Da fällt mir zu Z1 < Z2 + X UND Z1 > Z2 - X recht wenig ein. D.h., ich kann den Sinn darin nicht erkennen. Was ist für Dich X? 😕



  • X ist die Genauigkeit die Du haben möchtest. z.B. 0,0001. D.h. dann die beiden Zahlen sind gleich wenn Zahl 1 im Intervall +/-0,0001 um Zahl 2 liegt



  • Stell Dir den Zahlenstrahl vor. Auf dem Zahlenstral befindet sich die Zahl 2 und mit X wird ein Intervall auf dem Zahlenstrahl angegeben in dessen Mitte die Zahl 2 sich befindet. Man sagt nun wenn sich die Zahl 1 in dem durch X angegebenen Intervall um Z2 liegt dann sind Zahl 1 und Zahl 2 gleich



  • OK. Das kommt mir bekannt vor un leuchtet ein
    (auch einem SQL-verwöhnten User wie mir, der sich bei Vergleichen seltenst Gedanken um die Genauigkeit machen muß).

    Frage:
    0,333 mit Genauigkeit 3 == 0,333 mit Genauigkeit 3 sollte true ergeben ?

    also z.B. RoundTo(0.1,-1)==RoundTo(0.1,-1)



  • caspar_louis schrieb:

    Frage:
    0,333 mit Genauigkeit 3 == 0,333 mit Genauigkeit 3 sollte true ergeben ?

    also z.B. RoundTo(0.1,-1)==RoundTo(0.1,-1)

    RoundTo arbeitet mit multiplikationen mit zehnerpotenzen, welche wieder fließkommazahlen sind
    ERGO hast du wieder minimale Abweichungen vom gerundeten Ergebnis, wodurch zwei Zahlen, die gerundet gleich sind, immernoch als != eingestuft werden können

    wenn du RoundTo(0.1,-1) == RoundTo(0.1,-1) vergleichst, wird das true ergeben, da der Algo die gleichen Eingabedaten hat, also die gleiche minimale abweichung ergibt, aber bei RoundTo(0.101,-1) == RoundTo(0.099,-1) kann das schon ganz anders aussehen

    btw. Studierst du Informatik in Düsseldorf?


Anmelden zum Antworten