![]() |
AW: Ungewöhnliche ungültige Gleitkommaoperation
Übrigens, ich hatte heute die Fehlermeldung "Ungültige Gleitkommaoperation" bei dieser Berechnung:
Delphi-Quellcode:
Rauskopiert und einzeln berechnet ergibt das dagegen keinen Fehler.
x := Round(637 - 3.6854775808e-4927);
|
AW: Ungewöhnliche ungültige Gleitkommaoperation
Jede Wette, dass dabei das selbe raus kommt wie bei
Delphi-Quellcode:
, selbst ohne das Round().
x := 637;
4927 lässt sich kaum in den 11 Bits des Exponenten eines Doubles darstellen, womit deine Zahl dort effektiv 0 ist. Der Exponent geht bei Double von -308 bis +308, ein Bruchteil deines. Demnach sollte dort eine denormalisierte Gleitkommazahl vorliegen, welche durchaus auch schon mal komische Dinge in der FPU tun. Je nach dem was um diese Berechnung herum ähnliches passiert ist, kann das durchaus schon sein. Edit: Für einen Extended geht das, aber IMHO gibt es die doch auf 64 Bit CPUs gar nicht mehr. Was ist da los? |
AW: Ungewöhnliche ungültige Gleitkommaoperation
Zitat:
Nur wird, wenn deine Zielplattform 64 Bit ist, das Extended Format nicht mehr unterstützt, bei 32 Bit sehr wohl. |
AW: Ungewöhnliche ungültige Gleitkommaoperation
Zitat:
Ich würde mit Variants arbeiten. Dort kannst Du wunderbar mit dem als Zahl oder Datum nicht existierenden Wert 'nicht vorhanden' arbeiten, ohne irgendwelche Werte zu interpretieren. Variants haben explizite Konstanten (eigentlich sind das Funktionen, aber wie nicht veränderbare Konstanten zu behandeln), die da heißen 'Unassigned' und 'Null'. Damit hast Du deinen 'nicht vorhanden' Wert explizit dargestellt, kannst vor dem Zugriff prüfen etc. Wenn Dir Variants nicht passen (es soll Leute geben, die rümpfen die Nase, weil Variants angeblich ultralangsam sind. Oder old school), dann verwende doch einen Record, so in etwa.
Delphi-Quellcode:
Allerdings sind Variants auch nichts anderes als Records...
Type
TDateTimeRec = Record private var fValue : TDateTime; fIsValid : Boolean; function GetValue: TDateTime; procedure SetValue(const Value: TDateTime); public Property Value : TDateTime Read GetValue Write SetValue; Property IsValid : Boolean Read fIsValid Write fIsValid; End; { TDateTimeRec } function TDateTimeRec.GetValue: TDateTime; begin if not isValid Then Raise Exception.Create('Datetime not valid'); result := fValue; end; procedure TDateTimeRec.SetValue(const Value: TDateTime); begin fValue := Value; IsValid := True; end; Und: Ja, man muss ab und zu ein wenig mehr tippen, wenn man es richtig(er) machen will. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 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