Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Gleitkommazahlen Exponentialschreibweise unerwünscht (https://www.delphipraxis.net/136929-gleitkommazahlen-exponentialschreibweise-unerwuenscht.html)

LuCSteR 10. Jul 2009 13:31


Gleitkommazahlen Exponentialschreibweise unerwünscht
 
Hi,

ich möchte einfach abs(0.00007957 - 0.00008172) = 2,149995735E-6
alle 3 Variablen sind als real definiert.
Wird der Wertebereich überschritten oder warum zeigt er mir die zahl nur in Exponentialschreibweise an?
Wie kann ich den längeren Wert mit den 0en ausgeben lassen?

grüße

Reinhard Kern 10. Jul 2009 14:02

Re: Gleitkommazahlen Exponentialschreibweise unerwünscht
 
Zitat:

Zitat von LuCSteR
Hi,

ich möchte einfach abs(0.00007957 - 0.00008172) = 2,149995735E-6
alle 3 Variablen sind als real definiert.
Wird der Wertebereich überschritten oder warum zeigt er mir die zahl nur in Exponentialschreibweise an?
Wie kann ich den längeren Wert mit den 0en ausgeben lassen?

grüße

Hallo,

das ist ein für Fliesskommazahlen typischer Rundungsfehler, exakt wäre als Ergebnis -0.00000215 (macht mein Texas-Taschenrechner übrigens richtig). Dadurch wird erst das Ausgabeformat überschritten, hat mich gleich gewundert, dass sowas bei einer Subtraktion vorkommt. Der Taschenrechner von XP arbeitet übrigens auch exakt.

Ich finde den Fehler unzulässig, aber machen kannst du nicht viel, wenn dein Programm so rechnet. Du könntest es höchstens mit höherer Genauigkeit probieren, obwohl das eigentlich keinen Sinn macht, denn schliesslich subtrahierst du 2 4stellige Zahlen, das darf nicht schiefgehen.

Vielleicht findet sich hier im Forum ja noch ein Spezialist für Borland-Arithmetik, die hat schon so ihre Eigenheiten.

Gruss Reinhard

jfheins 10. Jul 2009 14:07

Re: Gleitkommazahlen Exponentialschreibweise unerwünscht
 
Die Genauigkeitz hat nichts mit der Schreibweise zu tun - mein Taschenrechner zeigt auch -2,15*10^-6 an ;)

Wie man das jetzt hinbekommt, dass statt der Exponentialschreibweise Nullen angezeigt werden, weis ich jetzt auch nicht - evtl. kann Format das, aber keine Garantie ;)

markus5766h 10. Jul 2009 14:09

Re: Gleitkommazahlen Exponentialschreibweise unerwünscht
 
Hallo,
nimm Extended, dann funktionierts (Genauigkeit)

für die Ausgabe wirst Du Dir wohl eine Funktion schreiben müssen:
-Umwandeln in String
-entspr. dem Exponenten gleiche Anzahl Nullen voranstellen
-und das Komma verschieben
-10er Potenz "abschneiden"

'was Anderes fällt mir auf die Schnelle nicht ein :(

LuCSteR 10. Jul 2009 14:14

Re: Gleitkommazahlen Exponentialschreibweise unerwünscht
 
Habe die 3 Variablen mal als extended definiert.
--> 2,15E-6
Sieht schon besser aus, und die genaugkeit reicht mir auch (ob da nun noch 99999..bla blub kommt.. ^^)
Müsst mir quasi ne Funktion schreiben die, 0en einfügt, das Komma an der richtigen Stelle setzt, und hinten E-6 abschneided. geht ja alles mit Stringoperationen. Kein Problem. Aber iwie ziemlich umständlich. Dachte es gibt vll ne fertige Funktion/Prozedur die mir die nicht exponentielle Darstellung ausgibt.

Hatte auch an Format gedacht, aber bis jetzt nix vernünftiges zusammenbekommen. Geht aber bestimmt.

Tyrael Y. 10. Jul 2009 14:17

Re: Gleitkommazahlen Exponentialschreibweise unerwünscht
 
Guck dir mal FormatFloat in der Delphi Hilfe an.

LuCSteR 10. Jul 2009 14:19

Re: Gleitkommazahlen Exponentialschreibweise unerwünscht
 
ja hab ich auch schon gesehen -,--
Sollte ich mir vll doch nochmal genau anschaun. Wobei ich Lazarus nutze und auf diesen Link zurückgreife.

alzaimar 10. Jul 2009 18:25

Re: Gleitkommazahlen Exponentialschreibweise unerwünscht
 
Zitat:

Zitat von markus5766h
Hallo,
nimm Extended, dann funktionierts (Genauigkeit)

Hier ja, aber das ist auch keine Garantie, denn...

... floating Point Zahlen stellen eine Dezimalzahl als Summe der Reihe (b_i*1/(2^i)) dar, wobei b_i das i.te Bit der Mantisse darstellt. Es ist logisch, das nicht alle Dezimalzahlen so exakt darzustellen sind.

Das Ein (TI)-Taschenrechner das richtig ausrechnet, liegt vermutlich daran, das er mit BCD-Arithmetik arbeitet. Das ist langsamer, aber eben genau (bis auf Rundungsfehler der letzten Stelle).

LuCSteR 20. Jul 2009 08:59

Re: Gleitkommazahlen Exponentialschreibweise unerwünscht
 
Habe nun endlich was fertiges gefunden. Mit der Funktion FloatToStrF lässt sich einiges in der Ausgabe tun.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:33 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