ferth 0.2.0

A safe, native-sized Forth. no_std compatible.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
\ From A.K. comp.lang.forth 2/4/2012
\ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

\ Below is some pretty old stuff for testing sum FP words. Don't know if it
\ is "compliant" or consistent or strictly mathematically correct. But perhaps
\ somebody might be willing to brush it up.

0 [if]
Changes made by Gerry Jackson
   1. Various as marked for GForth
   2. Tests with FLOATS Faligned etc removed as size of a float is
      implementation defined, therefore original tests not portable
   3. The FS. FE. and F. tests have been kept although different systems
      have a different interpretation of 'significant digits' in SET-PRECISION
[then]

\ THIS PROGRAM TESTS SOME OF THE FLOATING-POINT WORDS OF A MINFORTH SYSTEM

\ REQUIRE ttester.fs

CR .( Running ak-fp-test.fth)
CR .( ----------------------) CR  CR

TESTING --- MINFORTH FLOATING-POINT WORDS ---

\ : EMPTY-FPSTACK     \ ( F: ... -- ) EMPTY FLOATING-POINT STACK
\  BEGIN FDEPTH WHILE FDROP REPEAT ;

\ WARNING OFF
\ : }T FDEPTH 0<> ABORT" FP-STACK IS NOT EMPTY" }T ;
\ WARNING ON

\ EMPTY-FPSTACK
DECIMAL

\ ------------------------------------------------------------------------
TESTING BASIC FUNCTIONS

T{ -> }T        \ START    WITH CLEAN SLATE

T{ 0. d>f fdepth f>d -> 1 0. }T \ test the words used in EMPTY-FPSTACK
T{ 0. d>f fdrop fdepth -> 0 }T
T{ 0. d>f 0. d>f fdrop fdepth f>d -> 1 0. }T

T{ 0. d>f f>d -> 0. }T
T{ 1. d>f f>d -> 1. }T
T{ -1. d>f f>d -> -1. }T

\ IEEE754 max value (52 bit mantissa)
T{ hex fffffffffffff. decimal d>f f>d -> hex fffffffffffff. decimal }T

\ ------------------------------------------------------------------------
TESTING STACK OPERATIONS

T{ 1. d>f 2. d>f fswap f>d f>d -> 1. 2. }T
T{ 1. 2. 3. d>f d>f d>f frot f>d f>d f>d -> 3. 1. 2. }T
T{ -7. d>f fdup f>d f>d -> -7. -7. }T
T{ -4. d>f -2. d>f fover f>d f>d f>d -> -4. -2. -4. }T

\ ------------------------------------------------------------------------
TESTING BASIC ARITHMETICS

T{ 1. d>f fdup f+ f>d -> 2. }T
T{ -2. d>f -3. d>f f+ f>d -> -5. }T

T{ 1. d>f fdup f- f>d -> 0. }T
T{ -2. d>f -3. d>f f- f>d -> 1. }T

T{ 0. d>f fnegate f>d -> 0. }T
T{ 7. d>f fnegate f>d -> -7. }T
T{ -3. d>f fnegate f>d -> 3. }T

T{ 2. d>f fdup f* f>d -> 4. }T
T{ -3. d>f fdup f* f>d -> 9. }T
T{ -2. d>f 3. d>f f* f>d -> -6. }T
T{ 5. d>f -2. d>f f* f>d -> -10. }T
T{ 0. d>f -1. d>f f* f>d -> 0. }T
T{ 3. d>f 0. d>f f* f>d -> 0. }T

T{ 10. d>f 5. d>f f/ f>d -> 2. }T
T{ -33. d>f 11. d>f f/ f>d -> -3. }T
T{ 33. d>f -3. d>f f/ f>d -> -11. }T
T{ -14. d>f -7. d>f f/ f>d -> 2. }T
T{ 0. d>f 2. d>f f/ f>d -> 0. }T

\ ------------------------------------------------------------------------
TESTING COMPARISONS

T{ 1. d>f f0< -> false }T
T{ 0. d>f f0< -> false }T
T{ -1. d>f f0< -> true }T

T{ 0. d>f f0= -> true }T
T{ 1. d>f f0= -> false }T
T{ -2. d>f f0= -> false }T

T{ 1. d>f 2. d>f f< -> true }T
T{ 2. d>f 0. d>f f< -> false }T
T{ 0. d>f -2. d>f f< -> false }T
T{ -3. d>f -2. d>f f< -> true }T

T{ 1. d>f fabs f>d -> 1. }T
T{ -2. d>f fabs f>d -> 2. }T

T{ -2. d>f 1. d>f fmax f>d -> 1. }T
T{ -1. d>f -2. d>f fmax f>d -> -1. }T
T{ -1. d>f 0. d>f fmax f>d -> 0. }T
T{ 0. d>f -1. d>f fmax f>d -> 0. }T
T{ 1. d>f 2. d>f fmin f>d -> 1. }T
T{ -3. d>f -4. d>f fmin f>d -> -4. }T
T{ 1. d>f 0. d>f fmin f>d -> 0. }T
T{ 0. d>f -2. d>f fmin f>d -> -2. }T

T{ 10. d>f 11. d>f 1. d>f f~ -> false }T
T{ -10. d>f -11. d>f 2. d>f f~ -> true }T
T{ 1. d>f 2. d>f 1. d>f f~ -> false }T

T{ 0. d>f fdup fdup f~ -> true }T
T{ 1. d>f fdup 0. d>f f~ -> true }T
T{ -2. d>f fdup 0. d>f f~ -> true }T
T{ 3. d>f 4. d>f 0. d>f f~ -> false }T

T{ 2. d>f 3. d>f -1. d>f 5. d>f f/ f~ -> false }T
T{ 2. d>f 3. d>f -2. d>f 5. d>f f/ f~ -> true }T
T{ -2. d>f -3. d>f -1. d>f 5. d>f f/ f~ -> false }T
T{ -2. d>f -3. d>f -2. d>f 5. d>f f/ f~ -> true }T

\ ------------------------------------------------------------------------
TESTING MEMORY ACCESS, FLITERAL, FCONSTANT, FVARIABLE

VARIABLE FMEM 2 CELLS ALLOT

T{ 1. d>f fmem f! -> }T
T{ fmem f@ f>d -> 1. }T

FMEM 2 CELLS ERASE
T{ -2. d>f fmem sf! -> }T
T{ fmem sf@ f>d -> -2. }T
T{ fmem cell+ @ -> 0 }T

T{ 3. d>f fmem df! -> }T
T{ fmem df@ f>d -> 3. }T

: FT1 [ -2. d>f ] fliteral ;
T{ ft1 f>d -> -2. }T

-3. D>F FCONSTANT FT2
T{ ft2 f>d -> -3. }T

FVARIABLE FT4
T{ -4. d>f ft4 f! -> }T
T{ ft4 f@ f>d -> -4. }T

0 [if]  Tests removed as size of a float is implementation dependent
T{ 0 floats -> 0 }T
T{ 1 floats -> 8 }T
T{ -1 floats -> -8 }T
T{ 0 sfloats -> 0 }T
T{ 1 sfloats -> 4 }T
T{ -1 sfloats -> -4 }T
T{ 0 dfloats -> 0 }T
T{ 1 dfloats -> 8 }T
T{ -1 dfloats -> -8 }T
T{ 0 float+ -> 8 }T
T{ 0 sfloat+ -> 4 }T
T{ 0 dfloat+ -> 8 }T

T{ 8 faligned -> 8 }T
T{ 9 faligned -> 16 }T
T{ 10 faligned -> 16 }T
T{ 11 faligned -> 16 }T
T{ 12 faligned -> 16 }T
T{ 13 faligned -> 16 }T
T{ 14 faligned -> 16 }T
T{ 15 faligned -> 16 }T
T{ 16 faligned -> 16 }T
T{ 17 faligned -> 24 }T

T{ 4 sfaligned -> 4 }T
T{ 5 sfaligned -> 8 }T
T{ 6 sfaligned -> 8 }T
T{ 7 sfaligned -> 8 }T
T{ 8 sfaligned -> 8 }T
T{ 9 sfaligned -> 12 }T

T{ 8 dfaligned -> 8 }T
T{ 9 dfaligned -> 16 }T
T{ 10 dfaligned -> 16 }T
T{ 11 dfaligned -> 16 }T
T{ 12 dfaligned -> 16 }T
T{ 13 dfaligned -> 16 }T
T{ 14 dfaligned -> 16 }T
T{ 15 dfaligned -> 16 }T
T{ 16 dfaligned -> 16 }T
T{ 17 dfaligned -> 24 }T

T{ 0 c, falign here 7 and -> 0 }T
T{ 0 c, dfalign here 7 and -> 0 }T
T{ 0 c, sfalign here 3 and -> 0 }T
T{ falign here falign here = -> true }T
T{ dfalign here dfalign here = -> true }T
T{ sfalign here sfalign here = -> true }T
[THEN]
T{ 0  floats -> 0 }T
T{ 0 sfloats -> 0 }T
T{ 0 dfloats -> 0 }T

\ ------------------------------------------------------------------------
TESTING NUMBER INPUT
\ Leading and trailing spaces removed from strings because ANS Forth
\ does not specify they should be ignored

T{ s" ." >float -> false }T
T{ s" .E" >float -> false }T
T{ s" +.E+0" >float -> false }T
T{ s" E" >float -> false }T
T{ s" 0E" >float f>d -> true 0. }T
T{ s" 1E" >float f>d -> true 1. }T
T{ s" 1.E" >float f>d -> true 1. }T
T{ s" 1.E0" >float f>d -> true 1. }T
T{ s" 1.2E+1" >float f>d -> true 12. }T
T{ s" +1.2E1" >float f>d -> true 12. }T
T{ s" 120E-1" >float f>d -> true 12. }T
T{ s" -120E-1" >float f>d -> true -12. }T

T{ s" 1F" >float -> false }T  \ check against C floats
T{ s" 1D" >float f>d -> true 1. }T
T{ s" -1D" >float f>d -> true -1. }T

T{ s" 1EE" >float -> false }T
T{ s" 1DD" >float -> false }T
T{ s" 1E1E" >float -> false }T
T{ s" 1E 1E" >float -> false }T
T{ s" 1E  1E" >float -> false }T

T{ pad 0 >float f>d -> true 0. }T
T{ s"   " >float f>d -> true 0. }T  \ special case

T{ s" 2.0D0" >float f>d -> true 2. }T     \ Modified to make it compliant
T{ s" 2.0d+0" >float f>d -> true 2. }T    \ Modified to make it compliant
T{ s" -2.0e-0" >float f>d -> true -2. }T  \ Modified to make it compliant

T{ 1.0E0 f>d -> 1. }T
T{ -2.0E1 f>d -> -20. }T
T{ 200.0E-1 f>d -> 20. }T                 \ Modified to make it compliant
T{ +300.0E+02 f>d -> 30000. }T            \ Modified to make it compliant
T{ 10E f>d -> 10. }T
T{ -10E-1 f>d -> -1. }T

\ ------------------------------------------------------------------------
TESTING FRACTIONAL ARITHMETICS
DECIMAL

: F=    ( r1 r2 -- flag, true if exact identitiy )
  0E f~ ;

: TF=   ( r1 r2 -- flag, true if abs. error < 0.00005 )
  0.00005E f~ ;

T{ 1.E 1.00005E tf= -> false }T
T{ 1.E 1.00004E tf= -> true }T

T{ 3.33333E 6.66666E f+ 10E tf= -> true }T
T{ 10E 6.66666E f- 3.33333E tf= -> true }T
T{ 2E 0.02E f* 0.04E tf= -> true }T
T{ 10E 3E f/ 3.3333E tf= -> true }T
T{ -3E-3 fnegate +3E-3 f= -> true }T

T{ 2E floor 2E f= -> true }T
T{ 1.5E floor 1E f= -> true }T
T{ -0.5E floor -1E f= -> true }T
T{ 0E floor 0E f= -> true }T
T{ -0E floor -0E f= -> true }T            \ Modified to agree with GForth

T{ 2E fround 2E f= -> true }T
T{ 1.5E fround 2E f= -> true }T
T{ 1.4999E fround 1E f= -> true }T
T{ -0.4999E fround -0E f= -> true }T      \ Modified to agree with GForth
T{ -0.5001E fround -1E f= -> true }T
\ T{ 2.5E fround 2E f= -> true }T

T{ 4E fsqrt 2E tf= -> true }T
T{ 2E fsqrt 1.4142E tf= -> true }T
T{ 0E fsqrt 0E f= -> true }T
T{ 1E fsqrt 1E f= -> true }T

\ ------------------------------------------------------------------------
TESTING TRIGONOMETRIC FUNCTIONS

[UNDEFINED] PI [IF]
   3.1415926535897932384626433832795E FCONSTANT PI
[THEN]
PI   0.5E F* FCONSTANT PI2/
PI2/ 0.5E F* FCONSTANT PI4/

T{ 0E fsin 0E f= -> true }T
T{ pi fsin 0E tf= -> true }T
T{ pi2/ fsin 1E tf= -> true }T
T{ pi4/ fsin 0.7071E tf= -> true }T
T{ pi fnegate fsin 0E tf= -> true }T
T{ pi2/ fnegate fsin 1E fnegate tf= -> true }T
T{ pi4/ fnegate fsin -0.7071E tf= -> true }T
T{ 10E fsin -0.5440E tf= -> true }T

T{ 0E fcos 1E f= -> true }T
T{ pi fcos 1E fnegate tf= -> true }T
T{ pi2/ fcos 0E tf= -> true }T
T{ pi4/ fcos 0.7071E tf= -> true }T
T{ pi fnegate fcos 1E fnegate tf= -> true }T
T{ pi2/ fnegate fcos 0E tf= -> true }T
T{ pi4/ fnegate fcos 0.7071E tf= -> true }T
T{ 10E fcos -0.8391E tf= -> true }T

T{ 0E fsincos 1E f= 0E f= -> true true }T
T{ pi4/ fsincos f- 0E tf= -> true }T
T{ 2.3562E fsincos f+ 0E tf= -> true }T

T{ 0E ftan 0E f= -> true }T
T{ pi ftan 0E tf= -> true }T
T{ pi4/ ftan 1E tf= -> true }T
T{ pi 6E f/ ftan 0.57735E tf= -> true }T
T{ pi fnegate ftan 0E tf= -> true }T
T{ pi 6E f/ fnegate ftan -0.57735E tf= -> true }T
T{ pi4/ fnegate ftan 1E fnegate tf= -> true }T
T{ 10E ftan 0.6484E tf= -> true }T

T{ 0E fasin 0E f= -> true }T
T{ 0.5E fasin pi f/ 0.1667E tf= -> true }T
T{ 1E fasin pi f/ 0.5E tf= -> true }T
T{ -1E fasin pi f/ -0.5E tf= -> true }T

T{ 1E facos 0E tf= -> true }T
T{ 0.5E facos pi f/ 0.3333E tf= -> true }T
T{ 0E facos pi f/ 0.5E tf= -> true }T
T{ -1E facos pi tf= -> true }T

T{ 0E fatan 0E f= -> true }T
T{ 1E fatan 0.7854E tf= -> true }T
T{ 0.5E fatan 0.4636E tf= -> true }T
T{ -1E fatan -0.7854E tf= -> true }T

T{ 0E 1E fatan2 0E f= -> true }T
T{ 1E 1E fatan2 0.7854E tf= -> true }T
T{ -1E 1E fatan2 -0.7854E tf= -> true }T
T{ -1E -1E fatan2 -2.3562E tf= -> true }T
T{ 1E -1E fatan2 2.3562E tf= -> true }T

\ ------------------------------------------------------------------------
TESTING EXPONENTIAL AND LOGARITHMIC FUNCTIONS

T{ 0E fexp 1E f= -> true }T
T{ 1E fexp 2.7183E tf= -> true }T
T{ -1E fexp 0.3679E tf= -> true }T

T{ 0E fexpm1 0E f= -> true }T
T{ 1E fexpm1 1.7183E tf= -> true }T
T{ -1E fexpm1 -0.6321E tf= -> true }T

T{ 1E fln 0E f= -> true }T
T{ 2.7183E fln 1E tf= -> true }T
T{ 0.36788E fln -1E tf= -> true }T

T{ 1E flog 0E f= -> true }T
T{ 0.1E flog -1E tf= -> true }T
T{ 10E flog 1E tf= -> true }T

T{ 0E flnp1 0E f= -> true }T
T{ 1E flnp1 0.6931E tf= -> true }T
T{ -0.63212E flnp1 -1E tf= -> true }T

T{ 1E 0E f** 1E f= -> true }T
T{ 2E 2E f** 4E tf= -> true }T
T{ 2E 0.5E f** 1.4142E tf= -> true }T

T{ 0E falog 1E f= -> true }T
T{ 1E falog 10E tf= -> true }T
T{ -1E falog 0.1E tf= -> true }T

\ ------------------------------------------------------------------------
TESTING HYPERBOLIC FUNCTIONS

T{ 0E fsinh 0E f= -> true }T
T{ -1E fsinh -1.1752E tf= -> true }T
T{ 1E fsinh 1.1752E tf= -> true }T

T{ 0E fcosh 1E f= -> true }T
T{ 1E fcosh 1.5431E tf= -> true }T
T{ -1E fcosh 1.5431E tf= -> true }T

T{ 0E ftanh 0E f= -> true }T
T{ 1E ftanh 0.7616E tf= -> true }T
T{ -1E ftanh -0.7616E tf= -> true }T

T{ 0E fasinh 0E f= -> true }T
T{ -1E fasinh -0.8814E tf= -> true }T
T{ 1E fasinh 0.8814E tf= -> true }T

T{ 1E facosh 0E f= -> true }T
T{ 2E facosh 1.317E tf= -> true }T

\ ------------------------------------------------------------------------
TESTING NUMBER OUTPUT

CREATE FBUF 20 ALLOT
FBUF 20 ERASE

T{ 1E fbuf 5 represent -> 1 0 true }T           \ Modified to agree with GForth
T{ s" 10000" fbuf 5 compare -> 0 }T
\ T{ fbuf 5 + c@ -> 0 }T                        \ Not required

T{ -1E fbuf 5 represent -> 1 -1 true }T
T{ s" 10000" fbuf 5 compare -> 0 }T

T{ 100E 3E f/ fbuf 5 represent -> 2 0 true }T   \ Modified to agree with GForth
T{ s" 33333" fbuf 5 compare -> 0 }T
T{ 0.02E 3E f/ fbuf 5 represent -> -2 0 true }T \ Modified to agree with GForth
T{ s" 66667" fbuf 5 compare -> 0 }T

CR .( CHECKING FS. )

: YSS  \ ( a u -- ) type a new output check line
cr ." You might see " type ."  : " ;

5 SET-PRECISION

1E S" 1.0000E0 " YSS FS.         \ Modified to agree with GForth & Win32 Forth
20E S" 2.0000E1 " YSS FS.        \ Modified to agree with GForth & Win32 Forth
0.02E S" 2.0000E-2" YSS FS.      \ Modified to agree with GForth & Win32 Forth
-333.E2 S" -3.3300E4" YSS FS.    \ Modified to agree with GForth & Win32 Forth
10E 3E F/ S" 3.3333E0 " YSS FS.
0.2E 3E F/ S" 6.6667E-2" YSS FS.

CR .( CHECKING FE. )

1E S" 1.0000E0 " YSS FE.         \ Modified to agree with GForth & Win32 Forth
20E S" 20.000E0 " YSS FE.        \ Modified to agree with GForth & Win32 Forth
300E S" 300.00E0 " YSS FE.       \ Modified to agree with GForth & Win32 Forth
4000E S" 4.0000E3 " YSS FE.      \ Modified to agree with GForth & Win32 Forth
1E 3E F/ S" 333.33E-3" YSS FE.
2E4 3E f/ S" 6.6667E3 " YSS FE.

CR .( CHECKING F. )

1E3 S" 1000.  " YSS F.
1.1E3 S" 1100.  " YSS F.
1E 3E F/ S" 0.33333" YSS F.
200E 3E F/ S" 66.667 " YSS F.
0.000234E S" 0.00023" YSS F.     \ Modified to agree with GForth & Win32 Forth
0.000236E S" 0.00024" YSS F.     \ Modified to agree with GForth & Win32 Forth
\ -------------------------------------------------------------------------------------

CR
CR .( End of ak-fp-test.fth) CR