AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FloatToStrF Rundungsfehler ?

Ein Thema von egentur · begonnen am 28. Jan 2021 · letzter Beitrag vom 5. Feb 2021
Antwort Antwort
Seite 3 von 3     123   
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#21

AW: FloatToStrF Rundungsfehler ?

  Alt 4. Feb 2021, 16:35
Klingt als würde da ein Modul eine globale Einstellung ändern ...
TFormatSettings oder sowas.

Hilft denn mein Tipp nicht, um zuverlässig immer das gleiche Ergebnis zu erhalten?

LG Incocnito
  Mit Zitat antworten Zitat
egentur

Registriert seit: 27. Sep 2006
Ort: Freising
60 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#22

AW: FloatToStrF Rundungsfehler ?

  Alt 4. Feb 2021, 17:00
Hallo Incocnito

Doch , danke

Ich werde da die Messwerte immer als string mit 5 Nachkommastellen geliefert werden
nach der Konvertierung in double 0.000001 addieren
dann futionierts auch mit floattostrf(x,fffixed,6,4)

Ich musste das so machen weil der User die Nachkommastellen in seinem Grid/Report individuell einstellen wollte.


aber denoch würde ich gerne den Grund wissen !!
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#23

AW: FloatToStrF Rundungsfehler ?

  Alt 5. Feb 2021, 10:02
Vielleicht wurde in der Routine auch an dem CPU FloatingPoint ControlWord herumgefummelt.

vgl.
https://www.intel.com/content/dam/ww...l-1-manual.pdf
8.1.5 x87 FPU Control Word

Obwohl mir die Auswirkungen jetzt nicht bekannt sind.
Auf dem ersten Blick scheint es nur bei SSE- und SSE2-CPU-Funktionen relevant zu sein.
Fraglich, ob die an der Stelle überhaubt benutzt werden.

Du könntest zum Testen das ControlWord jeweils vorher auslesen.
(System.Get8087CW()) und prüfen ob irgendwelche Aufrufe vom QuickReport
da etwas ändern. Wir mussten feststellen, dass beim Arbeiten mit der Apollo-Datenbank
eine Funktion da was verstellt.

Ich hoffe diese Information hilft weiter.

Liebe Grüße
Incocnito
  Mit Zitat antworten Zitat
egentur

Registriert seit: 27. Sep 2006
Ort: Freising
60 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#24

AW: FloatToStrF Rundungsfehler ?

  Alt 5. Feb 2021, 12:33
Hallo Incocnito

In der Tat.

Beim ersten Durchlauf ergibt System.Get8087CW()

den Wert 4722 und bleibt bestehen ( hier rundet floattostrf(rv,fffixed,6,4) den Double Wert von 0.500149999999999983 auf 0,5002)

bis ich aus dem PrintPreview den Ausdruck auf den Drucker (unabhängig vom Druckertyp) wähle

danach ergibt System.Get8087CW()
den Wert 4978 und von da an wird korrekt gerundet also ( floattostrf(rv,fffixed,6,4) den Double Wert von 0.500149999999999983 auf 0,5001)

Gibt es dann hier eine Lösung ausser deiner beschriebenen ?
  Mit Zitat antworten Zitat
Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
110 Beiträge
 
Delphi 12 Athens
 
#25

AW: FloatToStrF Rundungsfehler ?

  Alt 5. Feb 2021, 14:41
Beim ersten Durchlauf ergibt System.Get8087CW() den Wert 4722 [...]
bis ich aus dem PrintPreview den Ausdruck auf den Drucker (unabhängig vom Druckertyp) wähle
danach ergibt System.Get8087CW()
Auf genau diese Problematik hatte doch Der schöne Günther in Beitrag #3 schon hingewiesen:
Zitat:
Ist das wieder der Mythos mit den Druckertreibern welche die FPU-Einstellungen verdrehen?
Scheint also doch kein Mythos zu sein... Oder doch ein Problem von QuockReport?
Achim
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#26

AW: FloatToStrF Rundungsfehler ?

  Alt 5. Feb 2021, 14:52
http://docwiki.embarcadero.com/Libra...stem.Set8087CW

http://docwiki.embarcadero.com/CodeE...087CW_(Delphi)

Demnach müsste 4978 der Defaultwert sein und die 4722 die Folge irgendeiner Änderung. Keine Ahnung wie man herausbekommt, woraus sie resultiert.

Eventuell mal alle Sourcen durchsuchen, ob irgendwo Set8087CW aufgerufen wird und welcher Wert dort gesetzt wird.

Wenn da nix zu finden ist, wird das von "irgendeiner Software / irgendeinem Treiber / ..." verändert.

Fraglich ist hierbei: Welche Nebenwirkungen entstehen, wenn Du selbst per Set8087CW(4972) den Wert setzt. Wer wie was auch immer die 4722 setzt, macht das (vermutlich) aus 'nem betimmten Grund und nicht nur "Just For Fun"

Edit:

Ein "ungünstiger" Aufruf von SetPrecisionMode aus der Unit Math könnte eventuell auch eine unerwünschte Nebenwirkung haben.

Geändert von Delphi.Narium ( 5. Feb 2021 um 15:41 Uhr)
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#27

AW: FloatToStrF Rundungsfehler ?

  Alt 5. Feb 2021, 15:30
Hier
http://docwiki.embarcadero.com/Libra....Default8087CW
steht, dass der Default-Wert $1332 also 4714 sein soll.

Aber auch bei mir ist beim Start dort schon ein anderer Wert enthalten.
Indy? QuickReport? Apollo Datenbank? Jedi? Keine Ahnung, wer den Wert verstellt.

Für deinen Fall:
4722 = 0001 0010 0111 0010
Rounding Contol = 00
Precission Control = 10 = Double Pressision 53bits
---
4978 = 0001 0011 0111 0010
Rounding Contol = 00
Precission Control = 11 = Double Extended Pressision 64bits

Eine höhere Genauigkeit führt hier nur zu einem anderen Ergebnis.
Meiner Meinung nach wird zwar bei erhöhter Genauigkeit mathematisch richtig rundet,
aber bei Einschaltung des gesunden Menschenverstandes eher falsch rundet.
Aufgerundet wird ja immer bei "5", aber durch die "Ungenauigkeit" des
PC steht dort "4,99999999", also muss ich trotzdem aufrunden, eben
weil das ja nur ein falscher Ausgagswert Aufgrund der technischen Gegebenheiten ist.
Außerdem um darauf wieder zurück zu kommen ist das jetzt der Fall für
deine 0,50015 ... für andere Zahlen sieht das wieder anders aus und du kannst
nicht "alle" Möglichkeiten testen (behaupte ich mal).

Das unterschiedliche Verhalten kann also durch das 8087 ControlWord erklärt werden.
Trotzdem empfehle ich (wie du es ja schon gemacht hast) das einfach zu umgehen.

LG Incocnito
  Mit Zitat antworten Zitat
egentur

Registriert seit: 27. Sep 2006
Ort: Freising
60 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#28

AW: FloatToStrF Rundungsfehler ?

  Alt 5. Feb 2021, 16:04
Danke an Incocnito und alle anderen

Ich habe auch im Source keine Stelle gefunden wo das explizit umgestellt wird.

Ich mach dann mal +0.000001

Schöne Grüße
  Mit Zitat antworten Zitat
egentur

Registriert seit: 27. Sep 2006
Ort: Freising
60 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#29

AW: FloatToStrF Rundungsfehler ?

  Alt 5. Feb 2021, 16:39
Kurzer Nachtrag

Ich hab doch noch eine DLL gefunden, die für die serielle Schnittstelle zu einem bestimmten
Messgeräte verwendet wird, und die verstellt den Wert !

Natürlich ohne source von extern

Aber wenn man endlich weiß
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 10:10 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