Addieren in if Abfrage
Hallo
Ich habe da ein ganz banales Problem:
Delphi-Quellcode:
funktioniert wie es soll, nur
if (3.12+1.5+3.25+0.4 = 8.27) then Label5.caption := 'true';
Delphi-Quellcode:
Funktioniert nicht, ich versteh es einfach nicht, aber bei einer multiplikation sieht es genauso aus!
a := 3.12;
b := 1.5; c := 3.25; d := 0.4; if (a+b+c+d = 8.27) then Label5.caption := 'true'; Die Zahlen sind alle extenden Variablen... Ganz banal, kann mir da einer helfen??? Ich benutze Delphi 7 Personal Danke!! |
Re: Addieren in if Abfrage
Hallo Niklas,
du musst richtig klammern:
Delphi-Quellcode:
Grüße vom marabu
if (a+b+c+d) = 8.27 then Label5.caption := 'true';
|
Re: Addieren in if Abfrage
Nein, sorry, geht trotzdem nicht...
EDIT: So gehts:
Delphi-Quellcode:
Nur warum??? :wiejetzt:
if ((a+b)+(c+d)) = 8.27 then Label5.caption := 'true';
|
Re: Addieren in if Abfrage
Abend,
Edit: ---sry, was überlesen :oops: --- mfG, Nico |
Re: Addieren in if Abfrage
Delphi-Quellcode:
bei diese abfrage gibt mir das *zensiert* Label "6,084" aus!! Ich versteh das nicht! Weil wenn a*b*c*d 6,084 sind, muss das Laberl doch "true" anzeigen!!
a := 3.12;
b := 1.5; c := 3.25; d := 0.4; if ((a*b*c*d)) = 6.084 then Label5.caption := 'true' else Label5.caption := floattostr(a*b*c*d); |
Re: Addieren in if Abfrage
Das mit der Klammerung war eine Fehlleistung von mir. Hier werden Gleitkommazahlen addiert und mit einer Näherung verglichen, was nur in seltenen Ausnahmefällen funktioniert. Hier wird ein Epsilon-Test benötigt:
Delphi-Quellcode:
Freundliche Grüße
if {Math.}IsZero(a+b+c+d - 8.27) then Label5.caption := 'true';
|
Re: Addieren in if Abfrage
Magst du nochmal bitte genau erklären, warum das so ist??
Nur aus interesse... Danke schonmal!! EDIT: Das ganze funktioniert leider nicht... Das {Math.} wird ignoriert und dann sagt er mir, das er nicht weiß, was IsZero ist... |
Re: Addieren in if Abfrage
Das Problem ist, dass deine Gleitkommazahlen sich nur in seltenen Fällen exakt binär darstellen lassen. In der Regel erhältst du eine binäre Näherung. Ein Test auf Gleichheit schlägt dann zwangsläufig fehl. Näheres dazu findest du unter dem von mir verwendeten terminus technicus "Epsilon Test" - auch hier im Forum.
|
Re: Addieren in if Abfrage
Danke, das habe ich mir fast gedacht, das ist auch der Grund warum ich extended genommen habe, denn bei real wird der ganze Rattenschwanz dann auch noch angezeigt...
Aber das ganze funktioniert leider nicht... Das {Math.} wird ignoriert und dann sagt er mir, das er nicht weiß, was IsZero ist... Und nun?? EDIT: So funktioniert das ganze:
Delphi-Quellcode:
Ist aber nicht ganz so elegant...
if ((6.084 - summe < 0.001) and (6.084 - summe > -0.001)) then Label5.caption := 'true';
|
Re: Addieren in if Abfrage
Deswegen ja auch Math.IsZero...
Er will mit den geschweiften Klammern sagen, dass IsZero in der UNit Math steckt. Also musst Du die Unit Math in Deine Uses-Klauses aufnehmen, dann findet er die Funktion auch. |
Re: Addieren in if Abfrage
Zitat:
0,2*2=0,4 -0 MSB 0,4*2=0,8 -0 0,8*2=1,6 -1 0,6*2=1,2 -1 0,2*2=0,4 -0 LSB usw, du siehst es ist kein Ende in Sicht, das Spielchen könnte man ewig so weiter treiben. Andere Zahlen hingegen lassen sich sehr gut Darstellen, wie zB 0,5 0,5*2=1 -1 MSB/LSB Du kannst auch Spaßeshalber mal einem Float-Wert zB 0,2 zuweisen, einen haltepunkt auf die Zeile dahinter setzen und dir das Ergebnis im Debugger anschauen. |
Re: Addieren in if Abfrage
Wer keine Math-Unit hat, der kann sich leicht einen eigenen Epsilon-Test implementieren:
Delphi-Quellcode:
function IsZero(value: Extended; epsilon: Extended = 0): Boolean;
begin if epsilon = 0 then epsilon := 1E-15 else epsilon := Abs(epsilon); Result := Abs(Value) <= epsilon; end; function IsEqual(value1, value2: Extended): Boolean; begin Result := IsZero(value1 - value2); end; |
Re: Addieren in if Abfrage
Danke für die extrem schnelle und gute Hilfe!!
Für meine Zwecke reicht extended erstmal, es ging nur darum per Bruteforce das hier zu lösen: a+b+c+d=9,27 a*b*c*d=9,27 Da es sich um einen Wettbewerb der TU Freiberg handelt, habe ich bewusst andere Zahlen genommen um anderen Mitspielern nicht die freude zu verderben. :-D Und den Algorithmus habe ich ja alleine geschrieben nur das er, aus mir bis dahin unersichtlichen Gründen, nicht funktioniert hat. Danke nochmal! :hello: Ich habe jetzt auch verstanden warum das ganze in delphi bzw in anderen Programmiersprachen bzw im Binärsystem so schwer ist. |
Re: Addieren in if Abfrage
Ich verweise da mal auf SameValue(), damit man nicht anfängt durch die hier gebotenen Lösungen das Rad neu zu erfinden, soweit die Funktion denn vorhanden ist.
|
Re: Addieren in if Abfrage
Zitat:
Delphi-Quellcode:
:zwinker:
function IsZero(value: Extended; epsilon: Extended = 1E-15): Boolean;
begin Result := Abs(Value) <= Abs(epsilon); end; function IsEqual(value1, value2: Extended): Boolean; begin Result := IsZero(value1 - value2); end; |
Re: Addieren in if Abfrage
Hallo Xong,
die Signatur von IsZero() war bei mir von der Unit Math vorgegeben. Die von dir eingeführte Eleganz hat den Nachteil, dass der Fall Epsilon = 0 zugelassen wird - genau das aber wollen wir alle in diesem Thread verhindern. Übrigens: Math.SameValue() liefert falsche Ergebnisse, sobald ein negativer Wert für Epsilon übergeben wird, weil intern kein Absolutbetrag gebildet wird. Freundliche Grüße |
Re: Addieren in if Abfrage
Zitat:
Und zu guter Letzt: Der Fall "0" wird zugelassen! Mir fallen dafür sogar (wenn auch nur exemplarische) Anwendungen ein. (Z.B. Überprüfung der Fehlerfortpflanzung bei mathematisch äquivalenten Termen.) LG, Xong EDIT: Ich hab recht! :P |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz