Forth: Difference between revisions

From Noisebridge
Jump to navigation Jump to search
m (→‎sample: fix point)
(→‎sample: all teh squares)
 
Line 81: Line 81:




'''fix point sqrt'''
'''fix point 1 sqrt'''
<pre>
<pre>
...
: pt 8 emit 46 emit ;
: pt 8 emit 46 emit ;
: fixpt1 10 /mod . pt . ;
: fixpt1 10 /mod . pt . ;
Line 90: Line 91:


result <code>1.7</code>
result <code>1.7</code>
'''fix point 2 sqrt'''
<pre>
...
: xxsqrt 10000 * nsqrt fixpt2 ;  ok
33 xxsqrt
</pre>
result <code>5.74</code>
'''print square root'''
<pre>
...
: psqrt dup 42949672 > if nsqrt . else dup 429496 > if xsqrt else xxsqrt then then ;
123 psqrt
1234567 psqrt
123456789 psqrt
</pre>
result <code>11.09, 1111.1, 11111</code>


== links ==
== links ==

Latest revision as of 19:45, 14 October 2017

sample[edit | edit source]

2 + 2

2
2
+
.

result 4


9 % 4

9
4
/mod
.s

result 1 2


square word

: sq dup * ;
2 sq
.s

result 4


hello world

: hw ." hello world" ;
hw

result hello world


integer square root

-1
variable x
256 x !
variable g
1 g ! 
: r x @ g @ / ;
: a g @ + 2/ g ! ;
: t r a g @ .s ;
: c over over = . ;
t c
...
t c

result

t c <2> -1 128 0  ok
t c <3> -1 128 65 0  ok
t c <4> -1 128 65 34 0  ok
t c <5> -1 128 65 34 20 0  ok
t c <6> -1 128 65 34 20 16 0  ok
t c <7> -1 128 65 34 20 16 16 -1  ok


integer square root

: a + 2/ ;
: sq dup * ;
: sc 2dup sq < if 0 else 2dup 1+ sq < then ;
: nsqrt 1 begin sc if swap drop exit then 2dup / a again ;
100 nsqrt .

result 10


fix point 1 sqrt

...
: pt 8 emit 46 emit ;
: fixpt1 10 /mod . pt . ;
: xsqrt 100 * nsqrt fixpt1 ;
3 xsqrt

result 1.7


fix point 2 sqrt

...
: xxsqrt 10000 * nsqrt fixpt2 ;  ok
33 xxsqrt

result 5.74


print square root

...
: psqrt dup 42949672 > if nsqrt . else dup 429496 > if xsqrt else xxsqrt then then ;
123 psqrt
1234567 psqrt
123456789 psqrt

result 11.09, 1111.1, 11111

links[edit | edit source]

http://amforth.sourceforge.net/

AmForth, Floating point and ATmega implementation:

Pygmy Forth: http://pygmy.utoh.org/riscy/