2016-05-03 20 views
-3

Ich verwende TFDTable Komponente in Delphi Seattle. Ich habe diese Tabellenkomponente zur Entwurfszeit behalten.Fließkommaexaktes Ergebnis Ausnahme in TFDTable Komponente in Delphi

Während der Ausführung TFDTable (Compo) .Open

ich Fehler erhalten während des Debuggens (Strg + F7) "Floating Point ungenauen Ergebnis bei 0042F353"

gegoogelt ich, bekam aber den Grund aber nicht bekomme genau das was es ist.

Irgendwelche Vorschläge?

Reference URL:

http://www.delphigroups.info/2/e8/524771.html

Floating Point ungenaues Ergebnis

Diese Ausnahme läßt vermuten, dass Sie die "Verlust an Präzision" Maskenbit im FPU ausgeschaltet haben. Es ist normalerweise ON. Suchen Sie nach dem $ 0020-Bit in der Systemvariablen Default8087CW und versuchen Sie, in 0020 $ 020 in das Steuerwort mit einer Set8087CW (Default8087CW oder $ 0020) -Anweisung zu versuchen.

http://www.umiacs.umd.edu/~resnik/ling645_sp2002/cmu_manual/node19.html

+0

Was genau bekommen Sie nicht? Bitte seien Sie genauer und kopieren Sie die relevanten Zeilen, auf die Sie verweisen möchten (behalten Sie den Quelllink bei). Ohne den relevanten Text hier könnte Ihre Frage für zukünftige Leser wertlos werden. IMO, der Text, den ich * glaube * Sie beziehen sich auf Staaten klar, worum es geht. –

+0

Welchen Treiber benutzen Sie? Welche Art von Daten geben Sie zurück? Erhalten Sie diesen Fehler für eine Tabelle oder nur für einen bestimmten? Haben Sie versucht, eine Kopie dieser Tabelle zu öffnen, aber ohne Daten? Das Problem kann der Treiber sein, eine nicht unterstützte Funktion in der Tabelle, die Sie öffnen möchten, oder ein Wert in der Tabelle, der falsch verarbeitet wird. –

+0

Sie müssen in Ihrem q einen echten Code mit ausreichenden Details anzeigen, damit die Leser Ihr Problem reproduzieren können, wenn Sie Hilfe benötigen. TFDTable (Compo). Offen ist offensichtlich kein echter Code. – MartynA

Antwort

1

Es ist ein gut bekanntes Problem, dass Default8087CW als globaler Variable kann durch Bibliotheken oder sogar Ihren eigenen Code missbraucht werden und jederzeit in einer Weise verändert werden, die zu unerwarteten Ergebnisse der FP-Berechnungen oder unerwarteter verursachen Ausnahmen auftreten. Die sechs niedrigsten Bits der 8087 FPU Control word sind die Ausnahme mask Bits, was bedeutet, dass, wenn ein Bit gesetzt ist, entsprechende Ausnahme ist maskiert, die verhindert wird ausgelöst werden.

Das "Loss of Precision" -Maskenbit, von dem John Herbster spricht, ist eines dieser Bits, in Delphis TArithmeticException enum exPrecision genannt. Weiter schlägt er vor sicherzustellen, dass dieses Bit durch den Aufruf der Set8087CW(Default8087CW or $0020) gesetzt wird. Da Sie Delphi 10 Seattle verwenden, empfiehlt es sich, anstatt die SetExceptionMask() Funktion (von der System.Math Einheit) zu verwenden, da es gleichermaßen behandelt auch die entsprechenden SSE Maske auf 64-Bit-hw:

var 
    OldExceptionMask: TArithmeticExceptionMask; 
... 
OldExceptionMask := SetExceptionMask(GetExceptionMask + [exPrecision]); 

die oben Aufruf vor TFDTable(Compo).Open sollte dein Problem lösen.

Die Funktion übernimmt und gibt einen TArithmeticExceptionMask (Satz TArithmeticException) zurück. Alle anderen Ausnahmeregelungen und FPU/SSE-bezogenen Funktionen sind in der documentation.