X-Git-Url: http://git.subgeniuskitty.com/pforth/.git/blobdiff_plain/bb6b2dcdd9acffabfd373c4c3f6b64a9cc43f335..1f99f95d6a7eecc05cae8fb357f9b7bf564c2725:/fth/math.fth diff --git a/fth/math.fth b/fth/math.fth index bad711d..5e70651 100644 --- a/fth/math.fth +++ b/fth/math.fth @@ -1,89 +1,92 @@ -\ @(#) math.fth 98/01/26 1.2 -\ Extended Math routines -\ FM/MOD SM/REM -\ -\ Author: Phil Burk -\ Copyright 1994 3DO, Phil Burk, Larry Polansky, Devid Rosenboom -\ -\ The pForth software code is dedicated to the public domain, -\ and any third party may reproduce, distribute and modify -\ the pForth software code or any derivative works thereof -\ without any compensation or license. The pForth software -\ code is provided on an "as is" basis without any warranty -\ of any kind, including, without limitation, the implied -\ warranties of merchantability and fitness for a particular -\ purpose and their equivalents under the laws of any jurisdiction. - -anew task-math.fth -decimal - -: FM/MOD { dl dh nn | dlp dhp nnp rem quo -- rem quo , floored } - dl dh dabs -> dhp -> dlp - nn abs -> nnp - dlp dhp nnp um/mod -> quo -> rem - dh 0< - IF \ negative dividend - nn 0< - IF \ negative divisor - rem negate -> rem - ELSE \ positive divisor - rem 0= - IF - quo negate -> quo - ELSE - quo 1+ negate -> quo - nnp rem - -> rem - THEN - THEN - ELSE \ positive dividend - nn 0< - IF \ negative divisor - rem 0= - IF - quo negate -> quo - ELSE - nnp rem - negate -> rem - quo 1+ negate -> quo - THEN - THEN - THEN - rem quo -; - -: SM/REM { dl dh nn | dlp dhp nnp rem quo -- rem quo , symmetric } - dl dh dabs -> dhp -> dlp - nn abs -> nnp - dlp dhp nnp um/mod -> quo -> rem - dh 0< - IF \ negative dividend - rem negate -> rem - nn 0> - IF \ positive divisor - quo negate -> quo - THEN - ELSE \ positive dividend - nn 0< - IF \ negative divisor - quo negate -> quo - THEN - THEN - rem quo -; - - -: /MOD ( a b -- rem quo ) - >r s>d r> sm/rem -; - -: MOD ( a b -- rem ) - /mod drop -; - -: */MOD ( a b c -- rem a*b/c , use double precision intermediate value ) - >r m* - r> sm/rem -; -: */ ( a b c -- a*b/c , use double precision intermediate value ) - */mod - nip -; +\ @(#) math.fth 98/01/26 1.2 +\ Extended Math routines +\ FM/MOD SM/REM +\ +\ Author: Phil Burk +\ Copyright 1994 3DO, Phil Burk, Larry Polansky, David Rosenboom +\ +\ Permission to use, copy, modify, and/or distribute this +\ software for any purpose with or without fee is hereby granted. +\ +\ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +\ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +\ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL +\ THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +\ CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING +\ FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +\ CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +\ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +anew task-math.fth +decimal + +: FM/MOD { dl dh nn | dlp dhp nnp rem quo -- rem quo , floored } + dl dh dabs -> dhp -> dlp + nn abs -> nnp + dlp dhp nnp um/mod -> quo -> rem + dh 0< + IF \ negative dividend + nn 0< + IF \ negative divisor + rem negate -> rem + ELSE \ positive divisor + rem 0= + IF + quo negate -> quo + ELSE + quo 1+ negate -> quo + nnp rem - -> rem + THEN + THEN + ELSE \ positive dividend + nn 0< + IF \ negative divisor + rem 0= + IF + quo negate -> quo + ELSE + nnp rem - negate -> rem + quo 1+ negate -> quo + THEN + THEN + THEN + rem quo +; + +: SM/REM { dl dh nn | dlp dhp nnp rem quo -- rem quo , symmetric } + dl dh dabs -> dhp -> dlp + nn abs -> nnp + dlp dhp nnp um/mod -> quo -> rem + dh 0< + IF \ negative dividend + rem negate -> rem + nn 0> + IF \ positive divisor + quo negate -> quo + THEN + ELSE \ positive dividend + nn 0< + IF \ negative divisor + quo negate -> quo + THEN + THEN + rem quo +; + + +: /MOD ( a b -- rem quo ) + >r s>d r> sm/rem +; + +: MOD ( a b -- rem ) + /mod drop +; + +: */MOD ( a b c -- rem a*b/c , use double precision intermediate value ) + >r m* + r> sm/rem +; +: */ ( a b c -- a*b/c , use double precision intermediate value ) + */mod + nip +;