Double-Cell Words

forth

These words are in forth.

2drop

( d – )

Double drop

2swap

( d1 d2 – d2 d1 )

Double swap

2over

( d1 d2 – d1 d2 d1 )

Double over

2dup

( d1 – d1 d1 )

Double dup

2nip

( d1 d2 – d2 )

Double nip

2tuck

( d1 d2 – d2 d1 d2 )

Double tuck

2rot

( d1 d2 d3 – d2 d3 d1 )

Double rot

4dup

( d1 d2 – d1 d2 d1 d2 )

Quadruple dup

2r@

( R: d1 – d1 ) ( – d1 )

Read two cells from the top of the return stack.

d=

( d1 d2 – f )

Test for the equality of two double cells

d<>

( d1 d2 – f )

Test for the inequality of two double cells

du<

( ud1 ud2 – f )

Unsigned double less than

du>

( ud1 ud2 – f )

Unsigned double greater than

du>=

( ud1 ud2 – f )

Unsigned double greater than or equal

du<=

( ud1 ud2 – f )

Unsigned double less than or equal

d<

( nd1 nd2 – f )

Signed double less than

d>

( nd1 nd2 – f )

Signed double greater than

d>=

( nd1 nd2 – f )

Signed double greater than or equal

d<=

( nd1 nd2 – f )

Signed double less than or equal

d0=

( d – f )

Double equal to zero

d0<>

( d – f )

Double not equal to zero

d0<

( nd – f )

Double less than zero

d0>

( nd – f )

Double greater than zero

d0>=

( nd – f )

Double greater than or equal to zero

d0<=

( nd – f )

Double less than or equal to zero

dnegate

( nd1 – nd2 )

Negate a double cell

dabs

( nd – ud )

Double absolute value

dmin

( nd1 nd2 – nd1|nd2 )

Double minimum

dmax

( nd1 nd2 – nd1|nd2 )

Double maximum

d+

( d1 d2 – d3 )

Add two double cells

d-

( d1 d2 – d3 )

Subtract two double cells

um+

( u1 u2 – u3 carry )

Add with carry

um*

( u1 u2 – ud )

Multiply two unsigned 32-bit values to get an unsigned 64-bit value

m*

( n1 n2 – d )

Multiply two signed 32-bit values to get a signed 64-bit value

ud*

( ud1 ud2 – ud3 )

Unsigned multiply 64 * 64 = 64

d*

( nd1 nd2 – nd3 )

Signed multiply 64 * 64 = 64

*/

( n1 n2 n3 – n4 )

Multiply signed n1 and n2 to get double cell intermediate value, then divide it by n3 to get a single cell result

*/mod

( n1 n2 n3 – n4 n5 )

Multiply signed n1 and n2 to get double cell intermediate value, then divide it by n3 to get a single cell remainder n4 and quotient n5

u*/

( u1 u2 u3 – u4 )

Multiply unsigned u1 and u2 to get double cell intermediate value, then divide it by u3 to get a single cell result

u*/mod

( u1 u2 u3 – u4 u5 )

Multiply unsigned u1 and u2 to get double cell intermediate value, then divide it by u3 to get a single cell remainder u4 and quotient u5

um/mod

( ud u1 – u2 u3 )

Divide unsigned ud by u1 and get a single cell remainder u2 and quotient u3

m/mod

( nd n1 – n2 n3 )

Divide signed nd by n1 and get a single cell remainder n2 and quotient n3

ud/mod

( ud1 ud2 – ud3 ud4 )

Divide unsigned ud1 by ud2 and get double cell remainder ud3 and quotient ud4

d/mod

( nd1 nd2 – nd3 nd4 )

Divide signed nd1 by nd2 and get double cell remainder nd3 and quotient nd4

ud/

( ud1 ud2 – ud3 )

Divide unsigned two double cells and get a double cell quotient

d/

( nd1 nd2 – nd3 )

Divide signed two double cells and get a double cell quotient

f*

( d1 d2 – d3 )

Multiply two s31.32 fixed-point numbers. Note that overflow is possible, where then the sign will be wrong.

f/

( d1 d2 – d3 )

Divide two s31.32 fixed-point numbers. Note that overflow is possible, where then the sign will be wrong.

udm*

( d1 d2 – dl dh )

Multiply two 64-bit double-cell numbers into a single 128-bit quadruple-cell number.

fi**

( f1 u – f2 )

Exponentiation of an S31.32 fixed-point number by an unsigned integer

fmod

( f1 f2 – f3 )

Compute the symmetric modulus of two S31.32 S31.32 fixed-point numbers.

ceil

( f – n )

Get the ceiling of a fixed-point number as a single-cell number.

floor

( f – n )

Get the floor of a fixed-point number as a single-cell number.

round-half-up

( f – n )

Round a fixed-point number up to the nearest integer with half rounding up.

round-half-down

( f – n )

Round a fixed-point number down to the nearest integer with half rounding down.

round-half-zero

( f – n )

Round a fixed-point number to the nearest integer with half rounding towards zero.

round-half-away-zero

( f – n )

Round a fixed-point number to the nearest integer with half rounding away from zero.

round-half-even

( f – n )

Round a fixed-point number to the nearest integer with half rounding towards even.

round-half-odd

( f – n )

Round a fixed-point number to the nearest integer with half rounding towards even.

round-zero

( f – n )

Round a fixed-point number towards zero.

round-away-zero

( f – n )

Round a fixed-point number away from zero.

sqrt

( f1 – f2 )

Square root of an S31.32 fixed-point number

expm1

( f1 – f2 )

Calculate (e^x)-1 where x is an S31.32 fixed-point number

exp

( f1 – f2 )

Calculate e^x where x is an S31.32 fixed-point number

lnp1

( f1 – f2 )

Calculate ln(x + 1) where x is an S31.32 fixed-point number

ln

( f1 – f2 )

Calculate ln(x) where x is an S31.32 fixed-point number

f**

( fb fx – fb^x )

Calculate b^x where b and x are S31.32 fixed-point numbers

sin

( f1 – f2 )

Calculate sin(x) where x is an S31.32 fixed-point number

cos

( f1 – f2 )

Calculate cos(x) where x is an S31.32 fixed-point number

tan

( f1 – f2 )

Calculate tan(x) where x is an S31.32 fixed-point number

asin

( f1 – f2 )

Calculate asin(x) where x is an S31.32 fixed-point number

acos

( f1 – f2 )

Calculate acos(x) where x is an S31.32 fixed-point number

atan

( f1 – f2 )

Calculate atan(x) where x is an S31.32 fixed-point number

atan2

( fy fx – fangle )

Calculate the angle of any pair of x and y coordinates where they are all S31.32 fixed-point numbers

sinh

( f1 – f2 )

Calculate sinh(x) where x is an S31.32 fixed-point number

cosh

( f1 – f2 )

Calculate cosh(x) where x is an S31.32 fixed-point number

tanh

( f1 – f2 )

Calculate tanh(x) where x is an S31.32 fixed-point number

asinh

( f1 – f2 )

Calculate asinh(x) where x is an S31.32 fixed-point number

acosh

( f1 – f2 )

Calculate acosh(x) where x is an S31.32 fixed-point number

atanh

( f1 – f2 )

Calculate atanh(x) where x is an S31.32 fixed-point number