| Autor |
Beitrag |
IhopeonlyReader
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Di 26.02.13 14:36
Guten Tag, warum funktioniert folgendes nicht?
Delphi-Quelltext 1: 2:
| if ((Dividend < 0) = (Divisor < 0)) then Result := '+' else Result := '-'; |
Wenn 1 Variable neg. eine pos ist, oder beide pos sind dann funktioniert es, wenn beide neg sind nicht..
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Di 26.02.13 14:40
Moin,
ich denke, du möchtest folgendes Verhalten erreichen:
Delphi-Quelltext 1: 2:
| if NOT ((Dividend < 0) XOR (Divisor < 0)) then Result := '+' else Result := '-'; |
Natürlich ungetestet.
Zuletzt bearbeitet von FinnO am Di 26.02.13 14:42, insgesamt 1-mal bearbeitet
|
|
IhopeonlyReader 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Di 26.02.13 14:42
ok die möglichkeit ist besser und funktioniert
aber wieso funktioniert meine nicht?
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
Gausi
      
Beiträge: 8553
Erhaltene Danke: 479
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 26.02.13 14:42
Ich würde darauf wetten, dass das daran liegt, dass "False" Null ist, und alles andere wahr. Könnte sein, dass der "genaue Wert" des Vergleichs nicht unbedingt definiert ist (Hauptsache, nicht Null).
Die Variante mit NOT .. XOR sollte klappen.
_________________ We are, we were and will not be.
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Di 26.02.13 14:43
Da ich nicht weiß, ob dein Code kompiliert, nehme ich das einfach mal an. Ich befürchte, die Nichtfunktion deines Codes ist auf Besonderheiten beim vergleich auf true zurückzuführen. Üblicherweise kann da jedoch z.B. jaenicke mehr zu sagen.
... na, da war ja wieder einer schneller.
|
|
Mathematiker
      
Beiträge: 2623
Erhaltene Danke: 1452
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 26.02.13 15:05
Hallo,
ich habe Folgendes probiert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.Button1Click(Sender: TObject); var dividend,divisor:integer; c:char; begin dividend:=strtoint(edit1.text); divisor:=strtoint(edit2.text); if ((Dividend < 0) = (Divisor < 0)) then c := '+' else c := '-'; label1.caption:=c; end; |
Und nun meine Frage: Wieso funktioniert das bei Dir nicht?
Gebe ich zwei negative Zahlen ein, erhalte ich korrekt "+".
D.h., zumindest bei Delphi 5 wird es für integer-Größen, aber auch extended, korrekt ausgeführt. Im Anhang befindet sich das Testprogramm.
Beste Grüße
Mathematiker
Einloggen, um Attachments anzusehen!
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Di 26.02.13 17:08
Moin,
ein Unterschied ist vor Allem, dass IhopeonlyReader einen anderen Datentyp verwendet als du. Trotzdem sollte man von Vergleichen auf true absehen, wie Gausi ja auch schon erwähnt hat, liegt der Fehler wahrscheinlich darin, dass sich die tatsächlichen Werte von Wahren Boolean-Ausdrücken intern unterscheiden können.
Booleans in Abfragen sollten daher grundsätzlich mit den richtigen Operatoren verknüpft werden und das sind nun einmal not, and, or, xor.
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Di 26.02.13 17:45
Also, ich habe das Ganze mit Delphi5 und Extended-Variablen getestet. Das Ganze funktioniert, so wie es sein soll. Bei beiden Zahlen negativ kommt + heraus.
Eigentlich ist das auch nicht logisch, dass der Vergleich TRUE = TRUE nicht TRUE ist!
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
Mathematiker
      
Beiträge: 2623
Erhaltene Danke: 1452
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 26.02.13 17:46
Hallo FinnO,
FinnO hat folgendes geschrieben : | ein Unterschied ist vor Allem, dass IhopeonlyReader einen anderen Datentyp verwendet als du. |
Ich habe jetzt extended und string verwendet
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var dividend,divisor:extended; c:string; begin dividend:=strtofloat(edit1.text); divisor:=strtofloat(edit2.text); if ((Dividend < 0) = (Divisor < 0)) then c := '+' else c := '-'; label1.caption:=c; end; |
und es funktioniert trotzdem! Jetzt interessiert es mich richtig. Könnte einer von Euch einmal prüfen, ob oder ob nicht es auch bei seinem Compiler funktioniert. Danke.
FinnO hat folgendes geschrieben : | | Booleans in Abfragen sollten daher grundsätzlich mit den richtigen Operatoren verknüpft werden und das sind nun einmal not, and, or, xor. |
Selbstverständlich. Da gibt es keinen Widerspruch.
Hallo Tranx,
Tranx hat folgendes geschrieben : | | Also, ich habe das Ganze mit Delphi5 und Extended-Variablen getestet. Das Ganze funktioniert, so wie es sein soll. |
Dank für den Test.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Di 26.02.13 18:22
Auch wenn Xor nun wahrlich kein super verständlicher Vergleichsoperator ist,
gibt es da neben der Möglichkeit:
Delphi-Quelltext 1:
| if not((Dividend<0) XOR (Divisor<0)) then Result := '+' else Result := '-'; |
noch:
Delphi-Quelltext 1:
| if ((Dividend<0) XOR (Divisor<0)) then Result := '-' else Result := '+'; |
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
Für diesen Beitrag haben gedankt: Anika
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 26.02.13 18:30
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| uses math; ... if sign(Dividend) <> sign(Divisor) then Result := '-' else Result := '+'; |
Oder andersherum, je nachdem, was man besser versteht.
Für diesen Beitrag haben gedankt: Tranx
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Di 26.02.13 18:47
Ich hätte noch eine Lösung, die allerdings nicht gilt, wenn der Divisor = 0 ist. Aber dann ist der Bruch eh nicht definiert:
Delphi-Quelltext 1:
| if (Dividend * Divisor<0) then Result := '-' else Result := '+'; |
Denn bekanntlich gelten ja für die Division die gleichen Vorzeichenregeln wie für die Multiplikation. Allerdings: Für Divisor 0 ist das Ergebnis mit 0 auf jeden Fall ein '+' und damit für negative Dividenden falsch. Aber diese Berechnung würde ich - um Programmabstürze zu vermeiden - unbedingt vorher abfangen.
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 26.02.13 18:54
Das sollte man bei Divisionen ja ohnehin.
|
|