| \ : facosh fdup fdup f* 1.0e0 f- fsqrt f+ fln ; |
\ : facosh fdup fdup f* 1.0e0 f- fsqrt f+ fln ; |
| \ : fasinh fdup fdup f* 1.0e0 f+ fsqrt f/ fatanh ; |
\ : fasinh fdup fdup f* 1.0e0 f+ fsqrt f/ fatanh ; |
| |
|
| \ !! factor out parts |
: f~abs ( r1 r2 r3 -- flag ) \ gforth |
| : f~ ( f1 f2 f3 -- flag ) \ float-ext |
\G Approximate equality with absolute error: |r1-r2|<r3. |
| |
frot frot f- fabs fswap f< ; |
| |
|
| |
: f~rel ( r1 r2 r3 -- flag ) \ gforth |
| |
\G Approximate equality with relative error: |r1-r2|<r3*|r1+r2|. |
| |
frot frot fover fabs fover fabs f+ frot frot |
| |
f- fabs frot frot f* f< ; |
| |
|
| |
: f~ ( r1 r2 r3 -- flag ) \ float-ext |
| |
\G ANS Forth medley: r3>0: @code{f~abs}; r3=0: r1=r2; r3<0: @code{fnegate f~abs}. |
| fdup f0= |
fdup f0= |
| IF |
IF |
| fdrop f= EXIT |
fdrop f= \ !! this does not work, because 0=-0 with f= on Linux-Intel |
| |
\ the standard says they should compare unequal |
| |
\ the comparison should be done with COMPARE |
| |
EXIT |
| THEN |
THEN |
| fdup f0> |
fdup f0> |
| IF |
IF |
| frot frot f- fabs fswap |
f~abs |
| ELSE |
ELSE |
| fnegate frot frot fover fabs fover fabs f+ frot frot |
fnegate f~rel |
| f- fabs frot frot f* |
THEN ; |
| THEN |
|
| f< ; |
|
| |
|
| : f.s ( -- ) \ gforth f-dot-s |
: f.s ( -- ) \ gforth f-dot-s |
| \G Display the number of items on the floating-point stack, |
\G Display the number of items on the floating-point stack, |