\ -------------------------------------- \ Copyright 2009-04-12, George E. Hubert \ -------------------------------------- [UNDEFINED] FTRUNC [IF] [UNDEFINED] FLOAT [IF] [ABORT] [THEN] : FTRUNC ( r1 -- r2 ) FDUP F0= 0= IF FDUP F0< IF FNEGATE FLOOR FNEGATE ELSE FLOOR THEN THEN ; [THEN] false [IF] fclear 10 set-precision float array -1E -1 s>f -1E f! :this -1E does> f@ ; float array 0E 0 s>f 0E f! :this 0E does> f@ ; float array -0E 0E fnegate -0E f! :this -0E does> f@ ; \ Testing \ ======= \ a) Systems which do NOT provide support for floating point signed zero: 0E FTRUNC 0E 0E F~ . cr \ TRUE s" 1E-9" s>float FTRUNC 0E 0E F~ . cr \ TRUE s" -1E-9" s>float FTRUNC 0E 0E F~ . cr \ TRUE s" -0.9E" s>float FTRUNC 0E 0E F~ . cr \ TRUE -1E s" 1E-5" s>float F+ FTRUNC 0E F= . cr \ TRUE -1E s" -1E-5" s>float F+ FTRUNC -1E F= . cr \ TRUE s" 3.14E" s>float FTRUNC s" 3E" s>float F= . cr \ TRUE s" 3.99E" s>float FTRUNC s" 3E" s>float F= . cr \ TRUE s" 4E" s>float FTRUNC s" 4E" s>float F= . cr \ TRUE s" -4E" s>float FTRUNC s" -4E" s>float F= . cr \ TRUE s" -4.1E" s>float FTRUNC s" -4E" s>float F= . cr \ TRUE \ b) Systems which support floating point signed zero: \ If result is TRUE (-1), problem may be with implementation of F~ \ Should print 0 to indicate system distinguishes between -0E and 0E -0E 0E 0E F~ . cr 0E FTRUNC 0E 0E F~ . cr \ TRUE -0E FTRUNC -0E 0E F~ . cr \ TRUE s" 1E-9" s>float FTRUNC 0E 0E F~ . cr \ TRUE s" -1E-9" s>float FTRUNC -0E 0E F~ . cr \ TRUE s" -0.9E" s>float FTRUNC -0E 0E F~ . cr \ TRUE -1E s" 1E-5" s>float F+ FTRUNC -0E F= . cr \ TRUE -1E s" -1E-5" s>float F+ FTRUNC -1E F= . cr \ TRUE s" 3.14E" s>float FTRUNC s" 3E" s>float F= . cr \ TRUE s" 3.99E" s>float FTRUNC s" 3E" s>float F= . cr \ TRUE s" 4E" s>float FTRUNC s" 4E" s>float F= . cr \ TRUE s" -4E" s>float FTRUNC s" -4E" s>float F= . cr \ TRUE s" -4.1E" s>float FTRUNC s" -4E" s>float F= . cr \ TRUE 0E FTRUNC F. .( => 0) cr -0E FTRUNC F. .( => -0) cr s" 1E-9" s>float FTRUNC F. .( => 0) cr s" -1E-9" s>float FTRUNC F. .( => -0) cr s" -0.9E" s>float FTRUNC F. .( => -0) cr -1E s" 1E-5" s>float F+ FTRUNC F. .( => -0) cr -1E s" -1E-5" s>float F+ FTRUNC F. .( => -1) cr s" 3.14E" s>float FTRUNC F. .( => 3) cr s" 3.99E" s>float FTRUNC F. .( => 3) cr s" 4E" s>float FTRUNC F. .( => 4) cr s" -4E" s>float FTRUNC F. .( => -4) cr s" -4.1E" s>float FTRUNC F. .( => -4) cr [THEN]