PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Delphi: exponentielle Darstellung der Null


eXistence
2005-03-21, 14:24:48
hi,
ich hab folgendes Problem: ich muss eine Fließkommazahl in der Exponentialdarstellung in einen String ausgeben und habe dafür genau 22 Zeichen + 1 Vorzeichen.
mit FloatToStrF(float, ffExponent, 17, 2) funktioniert das auch sehr gut.
Wenn mein Wert aber 0.0 ist, wird daraus 1.1125369143996395E-298!?

kann mir einer erklären wieso?
Das Float-Zahlen eine gewisse Ungenauigkeit mit sich bringen weiß ich, aber wieso erzeugt Delphi einen dreistelligen Exponenten, obwohl ich FloatToStrF mit digits=2 ausrufe?
Das sprengt dann nämlich plötzlich meinen String...

aths
2005-03-22, 00:19:32
hi,
ich hab folgendes Problem: ich muss eine Fließkommazahl in der Exponentialdarstellung in einen String ausgeben und habe dafür genau 22 Zeichen + 1 Vorzeichen.
mit FloatToStrF(float, ffExponent, 17, 2) funktioniert das auch sehr gut.
Wenn mein Wert aber 0.0 ist, wird daraus 1.1125369143996395E-298!?

kann mir einer erklären wieso? Normalisierte Mantisse.

http://www.3dcenter.org/artikel/fp_format/index5.php, das untere Kapitel.

DocEW
2005-03-22, 06:25:09
Normalisierte Mantisse.

http://www.3dcenter.org/artikel/fp_format/index5.php, das untere Kapitel.
Mit der internen Bit-Darstellung der Zahl sollte man auf dieser Ebene der Programmierung doch gar nichts zu tun haben, oder?
@eXistence: Sorry, eine Antwort für deine Frage habe ich auch nicht, wundert mich auch.

eXistence
2005-03-22, 08:12:57
Normalisierte Mantisse.
http://www.3dcenter.org/artikel/fp_format/index5.php, das untere Kapitel.

Hmmm, kann es sein, dass man die Null exponentiell mit nur zwei exponenten garnicht darstellen kann?
(jedenfalls nicht, ohne dabei sehr ungenau zu werden)

Da es ja immer eine führende Eins gibt, wäre die alternative ja 1.0000000000000000E-99. Dies wiederum ist schon relativ deutlich über Null...

wenn das stimmt, muss ich mir doch irgend nen workaround basteln :(

crusader4
2005-03-22, 10:32:39
Hmmm, kann es sein, dass man die Null exponentiell mit nur zwei exponenten garnicht darstellen kann?
(jedenfalls nicht, ohne dabei sehr ungenau zu werden)

Da es ja immer eine führende Eins gibt, wäre die alternative ja 1.0000000000000000E-99. Dies wiederum ist schon relativ deutlich über Null...

wenn das stimmt, muss ich mir doch irgend nen workaround basteln :(Ich hab zwar keine Antwort auf Deine Frage, aber das 10^-99 deutlich über 0 ist, kann nur ein Scherz sein. Wie genau willst du es denn noch haben? Die Zahl ist 0.0*96 Nullen*01. Ich persönlich halte schon 0.0000001 für ziemlich 0, für Berechnungen kann das natürlich noch zu wenig sein - ab 10^-30 reicht es aber mit Sicherheit um das als 0 festlegen zu können. Oder was hast du vor?

eXistence
2005-03-22, 10:48:00
Ich hab zwar keine Antwort auf Deine Frage, aber das 10^-99 deutlich über 0 ist, kann nur ein Scherz sein. Wie genau willst du es denn noch haben? Die Zahl ist 0.0*96 Nullen*01. Ich persönlich halte schon 0.0000001 für ziemlich 0, für Berechnungen kann das natürlich noch zu wenig sein - ab 10^-30 reicht es aber mit Sicherheit um das als 0 festlegen zu können. Oder was hast du vor?

ich schrieb extra relativ deutlich (im vergleich zu 1,[...]E-298) :)
Ich vermute, dass wegen dieser relativ (!) ;) hohen Abweichung, sich Delphi weigert, die Zahl mit nur zwei Exponenten darzustellen...

btw: ausgehend von diesem Wert werden Zeitindizes für Messwerte eines speziellen Digital-Oszilloskop berechnet.

crusader4
2005-03-22, 11:16:56
ich schrieb extra relativ deutlich (im vergleich zu 1,[...]E-298) :)
Ich vermute, dass wegen dieser relativ (!) ;) hohen Abweichung, sich Delphi weigert, die Zahl mit nur zwei Exponenten darzustellen...

btw: ausgehend von diesem Wert werden Zeitindizes für Messwerte eines speziellen Digital-Oszilloskop berechnet.Ok, hab mir Dein Problem noch mal richtig durchgelesen. Du hast den Wert 0,0 - den kann man halt nicht darstellen in dem Zahlenformat. Daher bastelt Dir Delphi einen Exponenten von -298 draus. Du brauchst aber einen zweistelligen Exponenten. Hab ich das so richtig verstanden? Welchen Zahlentyp verwendest du denn momentan? Vielleicht hilft es wenn du Single benutzt. Da ist der Exponent maximal zweistellig, und es dürfte immer noch für ein Oszi im einstelligen MHz-Bereich ausreichen (mehr dürfte im PC eh nicht möglich sein, eher weniger).

Übrigens: Der letzte Parameter Deiner Funktion legt dir jedenfalls die minimale Anzahl an Stellen für den Exponenten fest.

Leider kann ich Dein Problem nicht nachvollziehen. Mein Delphi spuckt bei 0.0 mit der von Dir verwendeten Funktion genau 0,0000000000000000E+00 aus?!

Grüße, Crusader

eXistence
2005-03-22, 11:27:27
Mein Delphi spuckt bei 0.0 mit der von Dir verwendeten Funktion genau 0,0000000000000000E+00 aus?!
Grüße, Crusader

Interessant...
Typ der Var ist bei mir double (und muss auch double bleiben), ich werde das nachher mal genauer unter die Lupe nehmen...

btw: es handelt sich um ein 6GHz-Oszi, ist also schon "etwas" größer =)

zeckensack
2005-03-22, 12:30:32
Du hast den Wert 0,0 - den kann man halt nicht darstellen in dem Zahlenformat.Doch, kann man.
Mantisse:=0, Exponent:=0 bedeutet laut IEEE-754 (sowohl single als auch double) dass die Zahl Null ist.
Mit dem Vorzeichen kann dann noch eine "positive Null" von einer "negativen Null" unterschieden werden. Aber xyz*10^-298 ist definitiv nicht die bestmögliche Darstellung für Null.

DocEW
2005-03-22, 19:45:47
Interessant...
Typ der Var ist bei mir double (und muss auch double bleiben), ich werde das nachher mal genauer unter die Lupe nehmen...

btw: es handelt sich um ein 6GHz-Oszi, ist also schon "etwas" größer =)
Hast wohl'n Pentium 1, was? ;)

eXistence
2005-03-22, 19:54:01
Hast wohl'n Pentium 1, was? ;)
öhm... ich steh grad etwas auf dem schlauch... was soll die Auflösung des Oszis (von dem die Quell-Daten stammen) mit meinem Rechner zu tun haben?

und komm mir bloß nicht mit "Humor ist wenn man trotzdem lacht" ;)

aths
2005-03-23, 01:33:42
Doch, kann man.
Mantisse:=0, Exponent:=0 bedeutet laut IEEE-754 (sowohl single als auch double) dass die Zahl Null ist.
Mit dem Vorzeichen kann dann noch eine "positive Null" von einer "negativen Null" unterschieden werden. Aber xyz*10^-298 ist definitiv nicht die bestmögliche Darstellung für Null.Genau.

Die Null ist ja von den mathematischen Eigenschaften einer Zahl ungleich Null sehr verschieden. Man braucht eine exakte Null, was IEEE auch liefert. Nur unvollständige Dekoder machen da eine Zahl ungleich Null draus.

DocEW
2005-03-23, 03:14:20
öhm... ich steh grad etwas auf dem schlauch... was soll die Auflösung des Oszis (von dem die Quell-Daten stammen) mit meinem Rechner zu tun haben?

und komm mir bloß nicht mit "Humor ist wenn man trotzdem lacht" ;)
Sorry, war ein bißchen ungeschickt zitiert... war darauf bezogen, daß es auf deinem Rechner eben nicht ganz null ist, während es auf anderen Rechnern läuft. ;)

aths
2005-03-23, 19:33:55
Sorry, war ein bißchen ungeschickt zitiert... war darauf bezogen, daß es auf deinem Rechner eben nicht ganz null ist, während es auf anderen Rechnern läuft. ;)... was mit einem FDIV-Bug nichts zu tun hat, wenn er denn einen alten Pentium hätte.

DocEW
2005-03-23, 20:31:44
... was mit einem FDIV-Bug nichts zu tun hat, wenn er denn einen alten Pentium hätte.
*seufz* Ich weiß doch... aber sicher erinnerst du dich an die ganzen tollen Witze aus der Zeit, von wegen man braucht 2,9999978943 Intel Techniker, um keine Ahnung was zu machen. War doch nur ein harmloser Spaß. =)