( d -- ) d>f f. \ ?

03/11/2007 - 23:49 von Michael Kalus | Report spam
Hm. Angenommen es làge das Ergebnis der Eingabe 1234.56789 auf dem
data stack (ds). Dann bringt d>f zwar diese Zahl auf den floating
point stack (fps), und die Uservariable DPL weist 5 Nachkommastellen
aus. Auf dem fps aber liegt nun eine 123456789. als Fließkommazahl,
also neun Vorkomma- und *keine* Nachkommastelle.

Hole ich mir nun DPL auf den ds, wandle in doppelt genau, schiebe das
auf den fps, negiere, wende falog darauf an und multipliziere beide,
erhalte ich die gesuchte Fließkommazahl.

Also so:

1234.56789
d>f DPL @ 0 d>f fnegate falog f*
cr cr f.s

1234.56789 ok


Gibt es einen besseren Weg?

Warum ist das eigentlich so, das DPL in d>f nicht mit berücksichtigt
wird?
Liegt es daran, das d>f in einem Programm ja nicht wissen kann woher
das d auf dem data stack gekommen ist, also der Programmierer hier
selbst seine Vorkehrungen treffen muss?


Benutzt wurde Gforth.
Michael
 

Lesen sie die antworten

#1 Marc Olschok
04/11/2007 - 01:11 | Warnen spam
Michael Kalus wrote:
Hm. Angenommen es làge das Ergebnis der Eingabe 1234.56789 auf dem
data stack (ds). Dann bringt d>f zwar diese Zahl auf den floating
point stack (fps), und die Uservariable DPL weist 5 Nachkommastellen
aus. Auf dem fps aber liegt nun eine 123456789. als Fließkommazahl,
also neun Vorkomma- und *keine* Nachkommastelle.

Hole ich mir nun DPL auf den ds, wandle in doppelt genau, schiebe das
auf den fps, negiere, wende falog darauf an und multipliziere beide,
erhalte ich die gesuchte Fließkommazahl.

Also so:

1234.56789
d>f DPL @ 0 d>f fnegate falog f*
cr cr f.s

1234.56789 ok


Gibt es einen besseren Weg?

Warum ist das eigentlich so, das DPL in d>f nicht mit berücksichtigt
wird?
Liegt es daran, das d>f in einem Programm ja nicht wissen kann woher
das d auf dem data stack gekommen ist, also der Programmierer hier
selbst seine Vorkehrungen treffen muss?



Ich vermute auch, dass das System dem Prinzip der geringstmöglichen
Einmischung folgt.

Das d>f soll ja auch dann noch funktionieren, wenn die double integer
durch irgendeine Berechnung zustandegekommen ist oder der Benutzer bloß
eine kleine Integer per s>d d>f auf den FP-Stack bringen will.

Aber selbst dann, wenn die Zahl direkt eingeben wurde, kann man nicht
ausschließen, dass der Benutzer wirklich bloß double auf den fp-Stack
bringen will. Weil das "." nur die Funktion einer Markierung für
double integer hat und seine Position in der Eingabe irrelevant ist

1234.56789 d. 123456789 ok
1.23456789 d. 123456789 ok

wàre dann die Verwendung von dpl auch nur störend.

Anders ist es natürlich bei direkter Eingabe

1234.56789e0 f. 1234.56789 ok
123456789e-5 f. 1234.56789 ok

weil hier klar ist, dass das "." wirklich als Dezimaltrenner gemeint ist.

Marc

Ähnliche fragen