AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Ungewöhnliche ungültige Gleitkommaoperation
Thema durchsuchen
Ansicht
Themen-Optionen

Ungewöhnliche ungültige Gleitkommaoperation

Ein Thema von Mikkey · begonnen am 16. Apr 2014 · letzter Beitrag vom 24. Apr 2014
Antwort Antwort
Seite 4 von 4   « Erste     234   
Popov
(Gast)

n/a Beiträge
 
#31

AW: Ungewöhnliche ungültige Gleitkommaoperation

  Alt 24. Apr 2014, 01:35
Übrigens, ich hatte heute die Fehlermeldung "Ungültige Gleitkommaoperation" bei dieser Berechnung:
x := Round(637 - 3.6854775808e-4927); Rauskopiert und einzeln berechnet ergibt das dagegen keinen Fehler.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#32

AW: Ungewöhnliche ungültige Gleitkommaoperation

  Alt 24. Apr 2014, 02:54
Jede Wette, dass dabei das selbe raus kommt wie bei x := 637; , selbst ohne das Round().

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?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (24. Apr 2014 um 03:02 Uhr)
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.077 Beiträge
 
Delphi XE2 Professional
 
#33

AW: Ungewöhnliche ungültige Gleitkommaoperation

  Alt 24. Apr 2014, 03:12
Edit: Für einen Extended geht das, aber IMHO gibt es die doch auf 64 Bit CPUs gar nicht mehr. Was ist da los?
Klar geht das.
Nur wird, wenn deine Zielplattform 64 Bit ist, das Extended Format nicht mehr unterstützt, bei 32 Bit sehr wohl.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#34

AW: Ungewöhnliche ungültige Gleitkommaoperation

  Alt 24. Apr 2014, 08:45
@ Sherlock:
Was würdest Du dann für eine Repräsentation von "nicht vorhanden" in einem Double-Wert verwenden, der als gültiger Wert beispielsweise zwischen -1E6 und 1E6 liegen kann. Früher wurde in dem System so etwas wie 1E32 dafür verwendet, was sich aber als besch^^^^^ungünstig herausgestellt hat.
Interpretation oder Kodierung allgemein (1E32 ist 'nicht vorhanden') zur Darstellung von Eigenschaften ist immer Murks. Immer. Du könntest dann auch '1234567' nehmen. Genauso blöd.

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:
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;
Allerdings sind Variants auch nichts anderes als Records...

Und: Ja, man muss ab und zu ein wenig mehr tippen, wenn man es richtig(er) machen will.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   

 

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 11:20 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