AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language TDate: Vergleich = 0 funktioniert nicht immer - warum?
Thema durchsuchen
Ansicht
Themen-Optionen

TDate: Vergleich = 0 funktioniert nicht immer - warum?

Ein Thema von rdeutsch · begonnen am 16. Mai 2024 · letzter Beitrag vom 17. Mai 2024
Antwort Antwort
Seite 1 von 2  1 2      
rdeutsch

Registriert seit: 24. Mär 2006
79 Beiträge
 
Delphi 12 Athens
 
#1

AW: TDate: Vergleich = 0 funktioniert nicht immer - warum?

  Alt 16. Mai 2024, 16:45
Danke euch.
Ja, in diesem Beispiel ist die Variable nicht initalisiert. Im Programmcode selbst schon.
Aber was mich eben am meisten irritiert ist, dass der ältere Programmcode anders reagiert als der jetztige Programmcode. Für dies müsste es doch eine Erklärung geben.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#2

AW: TDate: Vergleich = 0 funktioniert nicht immer - warum?

  Alt 16. Mai 2024, 17:03
Und natürlich auch noch Delphi-Referenz durchsuchenSameValue.

Es kommt drauf an wie und von wo der Wert kommt,
dann auch noch der Datentyp (Single oder Double, wobei TDateTime ein Double ist)
und wie die Fließkommaeinheit rechnet/vergleicht. (unterschiedliche Stetings, bezüglich Runden)
dazu dann noch wie die Fließkommaeinheit arbeitet/rechnet ... anderer CPU-Hersteller, anderes Modell use.
und
und
und

Und da Fließkommazahlen nunmal nie "genau" sind, sondern gerundet, kommt es hier eben darauf an wie gerundet wurde, wie und ob der Wert normalisiert wurde uvm.

Deine "0" könnte halt eigentlich ein 0.00000000000000000000001 sein, oder so.
Im Falle der 0 ließe sie sich genau darstellen, aber z.B. 1/3 nicht und schon kommt es drauf an, wer wie in welche Richtung gerundet hat, womit dann 1/3 eben nicht genau einem anderen 1/3 entsprechen muß.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (16. Mai 2024 um 17:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.630 Beiträge
 
Delphi 12 Athens
 
#3

AW: TDate: Vergleich = 0 funktioniert nicht immer - warum?

  Alt 17. Mai 2024, 08:41
Deine "0" könnte halt eigentlich ein 0.00000000000000000000001 sein, oder so.
Dann müsste das aber irgendwo so dort eingetragen worden sein. Obwohl ein TDate formell ein TDateTime ist und somit auch Zeitanteile speichern kann, ist die Bedeutung aber eindeutig auf ein Datum, also einen bestimmten Tag, festgelegt. Wenn dort dennoch ein Zeitanteil drin steht, dann ist das ein Fehler in der Zuweisung und ich finde man sollte diesen finden, anstatt jetzt alle Vergleiche zu korrigieren.

Die Frage ist also eigentlich: Wo kommt der Datumswert her, der dort eigentlich 0 sein sollte, es aber offenbar nicht ganz ist. Gerade eine 0 ist intern exakt darstellbar (siehe TExtendedHelper.SpecialType), was das Unschärfeargument in diesem Fall ins Leere laufen lässt. Mit einer Anpassung der Vergleiche (auf > 0) wird die eigentliche Ursache für das unterschiedliche Verhalten nur verdeckt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
rdeutsch

Registriert seit: 24. Mär 2006
79 Beiträge
 
Delphi 12 Athens
 
#4

AW: TDate: Vergleich = 0 funktioniert nicht immer - warum?

  Alt 17. Mai 2024, 09:12
Deine "0" könnte halt eigentlich ein 0.00000000000000000000001 sein, oder so.
.. Mit einer Anpassung der Vergleiche (auf > 0) wird die eigentliche Ursache für das unterschiedliche Verhalten nur verdeckt.
Da stimme ich dir zu, aber das Problem ist, dass sich an der Basis für die Zuweisung des Datumfeldes nichts geändert hat.
In meinem konkreten Programmcodeabschnitt erhält die Datumsvariable ihren Wert über einen Soap-Request. Weder am Service, der WSDL-Importunit noch im verarbeiteten Codeteil hat es Änderungen gegeben.

Die "einzige" Änderung der bisherigen Applikation zur aktuellen Version ist, dass auf UTF8 umgestellt wurde. D.h. z.B. persistente Felder wurden von TStringField auf TWideStringField geändert. Ansonsten wurde nichts verändert.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.630 Beiträge
 
Delphi 12 Athens
 
#5

AW: TDate: Vergleich = 0 funktioniert nicht immer - warum?

  Alt 17. Mai 2024, 09:31
Da stimme ich dir zu, aber das Problem ist, dass sich an der Basis für die Zuweisung des Datumfeldes nichts geändert hat.
In meinem konkreten Programmcodeabschnitt erhält die Datumsvariable ihren Wert über einen Soap-Request.
Dann würde ich zunächst an genau der Stelle (wie auch beim Vergleich) schauen, ob im Datumswert tatsächlich alle Bytes auf 0 stehen (z.B. eine Watch-Variable als Hex darstellen). Dem Debugger-Visualizer für TDate würde ich da nur begrenzt trauen.

Natürlich ist ein toleranterer Vergleich schnell und einfach umzusetzen. Trotzdem bleibt die eigentliche Ursache weiterhin verborgen. Das kann ja auch noch ganz andere Probleme verursachen, die ihr bloß noch nicht bemerkt habt. Wenn nicht, umso besser. Ich persönlich hätte dabei aber ein schlechtes Gefühl.

Man könnte auch einfach in if Trunc(aDate) > 0 then ändern. Damit wäre der Stunden-, Minuten-, Sekunden- und Millisekundenanteil egal.
Guter Hinweis! Ich würde in dem Fall dann sogar für DateOf aus System.DateUtils plädieren, das intern zwar dasselbe tut, aber die Intention besser darstellt.

Insbesondere würde ich das schon bei der Zuweisung machen. Dann kann man sich die Anpassung der Vergleiche nämlich sparen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
1.002 Beiträge
 
#6

AW: TDate: Vergleich = 0 funktioniert nicht immer - warum?

  Alt 17. Mai 2024, 09:41
Man könnte auch einfach in if Trunc(aDate) > 0 then ändern. Damit wäre der Stunden-, Minuten-, Sekunden- und Millisekundenanteil egal.
Guter Hinweis! Ich würde in dem Fall dann sogar für DateOf aus System.DateUtils plädieren, das intern zwar dasselbe tut, aber die Intention besser darstellt.

Insbesondere würde ich das schon bei der Zuweisung machen. Dann kann man sich die Anpassung der Vergleiche nämlich sparen.
Wenn ich mit reinen Datumswerten arbeite, mache ich das immer (mit Trunc). TDate ist eigentlich ein TDateTime und das ist eigentlich Double. Und einen Integer gegen eine Double zu testen ist, sofern die Zuweisung nicht unmittelbar davor passiert, eigentlich nie eine gute Idee.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.630 Beiträge
 
Delphi 12 Athens
 
#7

AW: TDate: Vergleich = 0 funktioniert nicht immer - warum?

  Alt 17. Mai 2024, 10:09
TDate ist eigentlich ein TDateTime und das ist eigentlich Double. Und einen Integer gegen eine Double zu testen ist, sofern die Zuweisung nicht unmittelbar davor passiert, eigentlich nie eine gute Idee.
In einem 64-Bit Double lassen sich Ganzzahlwerte bis 2^53 exakt und ohne Verlust speichern. Das ist wesentlich mehr als ein 32-Bit-Integer haben kann. Warum sollte das dann keine gute Idee sein?

Wenn in einem TDate kein Wert drin steht, der sich exakt in einen Integer umwandeln lässt, dann liegt meiner Meinung nach irgendwo ein Fehler vor. Das kann bei der Zuweisung sein oder einer anderen Manipulation (z.B. als var-Parameter einer Methode).
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.630 Beiträge
 
Delphi 12 Athens
 
#8

AW: TDate: Vergleich = 0 funktioniert nicht immer - warum?

  Alt 16. Mai 2024, 21:10
Ja, in diesem Beispiel ist die Variable nicht initalisiert. Im Programmcode selbst schon.
Aber was mich eben am meisten irritiert ist, dass der ältere Programmcode anders reagiert als der jetztige Programmcode. Für dies müsste es doch eine Erklärung geben.
Die kann aber auch an ganz anderer Stelle liegen. Z.B. bei der Zuweisung des Wertes.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
268 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: TDate: Vergleich = 0 funktioniert nicht immer - warum?

  Alt 17. Mai 2024, 05:48
Die Unit dateUtils enthält viele hilfreiche Funktionen um mit Datum und/oder Zeit umzugehen.
Aber in diesem Fall (falls kein Datum vor 1900 vorkommt) würde ich ganz trivial auf > 0.1 o.ä. vergleichen.
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
ConstantGardener

Registriert seit: 24. Jan 2006
Ort: Halberstadt
376 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: TDate: Vergleich = 0 funktioniert nicht immer - warum?

  Alt 17. Mai 2024, 05:53
...habt ihr von 32 auf 64 Bit umgestellt? Wir hatten hier ein Problem mit Pointern die nicht auf NIL initialisiert wurden unter 64Bit. Unter 32 Bit lief alles super
auf 64 kam es zu Fehlern, da im Programmcode von NIL als Startwert ausgegangen wurde.
Andreas Schachtner
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz