--- gforth/float.fs 2002/10/27 09:57:10 1.37 +++ gforth/float.fs 2004/12/31 13:23:57 1.46 @@ -1,6 +1,6 @@ \ High level floating point 14jan94py -\ Copyright (C) 1995,1997 Free Software Foundation, Inc. +\ Copyright (C) 1995,1997,2003,2004 Free Software Foundation, Inc. \ This file is part of Gforth. @@ -72,12 +72,12 @@ DOES> ( -- r ) \G floating-point stack. fp0 @ fp@ - [ 1 floats ] Literal / ; -: FLit ( -- r ) r> dup f@ float+ >r ; : FLiteral ( compilation r -- ; run-time -- r ) \ float f-literal \G Compile appropriate code such that, at run-time, @i{r} is placed \G on the (floating-point) stack. Interpretation semantics are undefined. - BEGIN here cell+ dup faligned <> WHILE postpone noop REPEAT - postpone FLit f, ; immediate + BEGIN here cell+ cell+ dup faligned <> WHILE postpone noop REPEAT + postpone ahead here >r f, postpone then + r> postpone literal postpone f@ ; immediate &15 Value precision ( -- u ) \ float-ext \G @i{u} is the number of significant digits currently used by @@ -211,7 +211,7 @@ set-current \G @code{f~abs}; r3=0: bitwise comparison; r3<0: @code{fnegate f~rel}. fdup f0= IF \ bitwise comparison - fp@ float+ 1 floats over float+ -text 0= + fp@ float+ 1 floats over float+ over str= fdrop fdrop fdrop EXIT THEN @@ -222,21 +222,14 @@ set-current fnegate f~rel THEN ; -2e 53e f** fconstant fround-offset \ !! does f** work correctly? +\ proposals from Krishna Myeni in +\ not sure if they are a good idea -: fround ( r1 -- r2 ) \ float f-round -\G Round to nearest integral value. Break ties with round-to-even. - \ assumes IEEE DP FP in round-to-even mode. - \ for an explanation of this code read - \ <2002Oct26.113823@a0.complang.tuwien.ac.at> ff. - fdup f0> if - fround-offset f- fround-offset f+ - else fdup f0< if \ leave 0e and -0e as is - fround-offset f+ fround-offset f- - then then ; - -: f.s ( -- ) \ gforth f-dot-s - \G Display the number of items on the floating-point stack, - \G followed by a list of the items; TOS is the right-most item. - ." <" fdepth 0 .r ." > " fdepth 0 max maxdepth-.s @ min dup 0 - ?DO dup i - 1- floats fp@ + f@ f. LOOP drop ; +: FTRUNC ( r1 -- r2 ) + \ round towards 0 + \ !! should be implemented properly + F>D D>F ; + +: FMOD ( r1 r2 -- r ) + \ remainder of r1/r2 + FOVER FOVER F/ ftrunc F* F- ;