matmul
FP matrix multiplication
- extensions
- raw README.md
- raw benchmark.4th
- raw matmul.4th
- raw package.4th
- raw runbenchs
- raw test.4th
\ example implementation
\ public domain
\ This is an ANS Forth program
\ The program uses the following words
\ from CORE :
\ Constant here allot Variable ! : @ +! ; dup IF >r r> THEN POSTPONE
\ immediate
\ from CORE-EXT :
\ 2>r 2r>
\ from BLOCK-EXT :
\ \
\ from FILE :
\ (
\ from FLOAT :
\ falign floats f! fswap frot f@ >float d>f f* f+ f- f/ f0< f0= f< f>d
\ fconstant fdrop fdup FLiteral floor fmax fmin fnegate fover fround
\ represent
\ from FLOAT-EXT :
\ df! df@ f** f. fabs facos facosh falog fasin fasinh fatan fatan2 fatanh
\ fcos fcosh fe. fexp fexpm1 fln flnp1 flog fs. fsin fsincos fsinh fsqrt
\ ftan ftanh f~ sf! sf@
\ After loading this program, a system is an ANS Forth system with a
\ separate floating-point stack.
\ Well, not quite: The following things are missing:
\ 1) The text interpreter does not put FP numbers on the new FP stack.
\ 2) The environmental query FLOAT-STACK is not answered correctly.
\ This has hardly been tested.
\ 12.3.3 The size of a floating-point stack shall be at least 6 items.
100 constant fp-stack-size
falign here fp-stack-size floats allot constant fp-stack
variable fp \ FP stack pointer
fp-stack fp !
: >fs ( r -- ) ( F: -- r )
fp @ f!
1 floats fp +! ;
: 2>fs ( r1 r2 -- ) ( F: -- r1 r2 )
fswap >fs >fs ;
: 3>fs ( r1 r2 r3 -- ) ( F: -- r1 r2 r3 )
frot >fs 2>fs ;
: fs> ( F: r -- r )
-1 floats fp +!
fp @ f@ ;
: 2fs> ( -- r1 r2 ) ( F: r1 r2 -- )
fs> fs> fswap ;
: 3fs> ( -- r1 r2 r3 ) ( F: r1 r2 r3 -- )
2fs> fs> frot frot ;
: >float ( c-addr u -- true | false ) ( F: -- r | )
>float dup if
>r >fs r>
then ;
: d>f ( d -- ) ( F: -- r )
d>f >fs ;
: f! ( f-addr -- ) ( F: r -- )
>r fs> r> f! ;
: f* ( F: r1 r2 -- r3 )
2fs> f* >fs ;
: f+ ( F: r1 r2 -- r3 )
2fs> f+ >fs ;
: f- ( F: r1 r2 -- r3 )
2fs> f- >fs ;
: f/ ( F: r1 r2 -- r3 )
2fs> f/ >fs ;
: f0< ( -- flag ) ( F: r -- )
fs> f0< ;
: f0= ( -- flag ) ( F: r -- )
fs> f0= ;
: f< ( -- flag ) ( F: r1 r2 -- )
2fs> f< ;
: f>d ( -- d ) ( F: r -- )
fs> f>d ;
: f@ ( f-addr -- ) ( F: -- r )
f@ >fs ;
: fconstant ( "<spaces>name" -- ) ( F: r -- )
fs> fconstant ;
: fdrop ( F: r -- )
fs> fdrop ; \ not very efficient
: fdup ( F: r -- r r )
fs> fdup 2>fs ;
: fliteral ( compilation: F: r -- ) ( run-time: F: -- r )
fs> postpone fliteral postpone >fs ; immediate
: floor ( F: r1 -- r2 )
fs> floor >fs ;
: fmax ( F: r1 r2 -- r3 )
2fs> fmax >fs ;
: fmin ( F: r1 r2 -- r3 )
2fs> fmin >fs ;
: fnegate ( F: r1 -- r2 )
fs> fnegate >fs ;
: fover ( F: r1 r2 -- r1 r2 r1 )
2fs> fover 3>fs ;
: frot ( F: r1 r2 r3 -- r2 r3 r1 )
3fs> frot 3>fs ;
: fround ( F: r1 -- r2 )
fs> fround >fs ;
: fswap ( F: r1 r2 -- r2 r1 )
2fs> fswap 2>fs ;
: represent ( c-addr u -- n flag1 flag2 ) ( F: r -- )
2>r fs> 2r> represent ;
: df! ( df-addr -- ) ( F: r -- )
>r fs> r> df! ;
: df@ ( df-addr -- ) ( F: -- r )
df@ >fs ;
: f** ( F: r1 r2 -- r3 )
2fs> f** >fs ;
: f. ( F: r -- )
fs> f. ;
: fabs ( F: r1 -- r2 )
fs> fabs >fs ;
: facos ( F: r1 -- r2 )
fs> facos >fs ;
: facosh ( F: r1 -- r2 )
fs> facosh >fs ;
: falog ( F: r1 -- r2 )
fs> falog >fs ;
: fasin ( F: r1 -- r2 )
fs> fasin >fs ;
: fasinh ( F: r1 -- r2 )
fs> fasinh >fs ;
: fatan ( F: r1 -- r2 )
fs> fatan >fs ;
: fatan2 ( F: r1 r2 -- r3 )
2fs> fatan2 >fs ;
: fatanh ( F: r1 -- r2 )
fs> fatanh >fs ;
: fcos ( F: r1 -- r2 )
fs> fcos >fs ;
: fcosh ( F: r1 -- r2 )
fs> fcosh >fs ;
: fe. ( F: r -- )
fs> fe. ;
: fexp ( F: r1 -- r2 )
fs> fexp >fs ;
: fexpm1 ( F: r1 -- r2 )
fs> fexpm1 >fs ;
: fln ( F: r1 -- r2 )
fs> fln >fs ;
: flnp1 ( F: r1 -- r2 )
fs> flnp1 >fs ;
: flog ( F: r1 -- r2 )
fs> flog >fs ;
: fs. ( F: r -- )
fs> fs. ;
: fsin ( F: r1 -- r2 )
fs> fsin >fs ;
: fsincos ( F: r1 -- r2 r3 )
fs> fsincos 2>fs ;
: fsinh ( F: r1 -- r2 )
fs> fsinh >fs ;
: fsqrt ( F: r1 -- r2 )
fs> fsqrt >fs ;
: ftan ( F: r1 -- r2 )
fs> ftan >fs ;
: ftanh ( F: r1 -- r2 )
fs> ftanh >fs ;
: f~ ( -- flag ) ( F: r1 r2 r3 -- )
3fs> f~ ;
: sf! ( sf-addr -- ) ( F: r -- )
>r fs> r> sf! ;
: sf@ ( sf-addr -- ) ( F: -- r )
sf@ >fs ;
\ code for FP number input
s" gforth" environment? [if]
s" 0.6.2" compare 0> [if]
:noname ( c-addr u -- ... xt )
2dup sfnumber
IF
>fs 2drop [comp'] FLiteral
ELSE
defers compiler-notfound1
ENDIF ;
IS compiler-notfound1
:noname ( c-addr u -- ... xt )
2dup sfnumber
IF
>fs 2drop ['] noop
ELSE
defers interpreter-notfound1
ENDIF ;
IS interpreter-notfound1
[else]
.( Please insert adapted FP number input code for your Gforth here ) abort
[then]
[else]
\ for other systems than Gforth
.( Please insert adapted FP number input code for your system here ) abort
[then]
by AntonErtl
Versions
2.0.2, 2.0.1, 2.0.0, 1.0.2, 1.0.1, 1.0.0
Tags
ansforth94, forth-94, forth-2012, floating-point-arithmetic, benchmark
Dependencies
None
Dependents
None