/
ieee-arith-test.4th
311 lines (254 loc) · 7.43 KB
/
ieee-arith-test.4th
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
( Title: IEEE Special Data Arithmetic Tests
File: ieee-arith~test.fs
Author: David N. Williams
Version: 0.5.1b
License: Public Domain
Last revision: August 17, 2009
The last revision date may reflect cosmetic changes not logged
below.
Version 0.5.1b
17Aug09 * Modified for use with kForth/unified stack systems. KM
Version 0.5.1
11Jul09 * Fixed tests with two NaN inputs so the output can be
either of the two, as allowed by IEEE. Solution
suggested by Marcel Hendrix.
Version 0.5.0
29Jun09 * Started
1Jul09 * Mostly finished.
8Jul09 * Added FNAN? for FSQRT nans.
)
\ for pfe:
\ s" FLOATING-EXT" environment? [IF] drop [THEN]
\ s" ttester.fs" included
include ans-words
include ttester
decimal
true verbose !
: ?.cr ( -- ) verbose @ IF cr THEN ;
?.cr
\ The ttester default for EXACT? is TRUE. Uncomment the
\ following line if your system needs it to be FALSE:
\ SET-NEAR
variable #errors 0 #errors !
:noname ( c-addr u -- )
(
Display an error message followed by the line that had the
error.
)
1 #errors +! error1 ; error-xt !
: ?.errors ( -- ) verbose @ IF ." #ERRORS: " #errors @ . THEN ;
\ [UNDEFINED] \\ [IF] \ for debugging
\ : \\ ( -- ) -1 parse 2drop BEGIN refill 0= UNTIL ; [THEN]
\ FABS should be superfluous in these:
0e fabs fconstant +0
+0 fnegate fconstant -0
1e 0e f/ fabs fconstant +inf
+inf fnegate fconstant -inf
\ FABS is not superflous here, because the sign of 0/0 is not
\ specified by IEEE, and is actually different in Mac OS X
\ ppc/intel (+/-), both for gforth and pfe. Note that IEEE-2008
\ does not require that 0/0 be a nan with zero load:
0e 0e f/ fabs fconstant +nan
+nan fnegate fconstant -nan
\ The following huge kludge is just for testing sqrt(-1)!
\ But maybe FNAN? can also be used to improve some of the other
\ tests.
[UNDEFINED] fnan? [IF]
: fdatum= ( f: r1 r2 -- s: flag ) 0e f~ ;
\ maybe this can be improved
: fnan? ( f: r -- s: isNaN? )
fdup +0 fdatum= >r
fdup -0 fdatum= r> or >r
fdup -inf fdatum= r> or >r
fdup +inf fdatum= r> or IF fdrop false EXIT THEN
+inf f< 0= ;
\ borrowed from ieee-fprox-test.fs
t{ +0 +0 fdatum= -> true }t
t{ +0 -0 fdatum= -> false }t
t{ -0 +0 fdatum= -> false }t
t{ -0 -0 fdatum= -> true }t
t{ 7e -2e fdatum= -> false }t
t{ -2e 7e fdatum= -> false }t
t{ 7e 7e fdatum= -> true }t
t{ 7e +inf fdatum= -> false }t
t{ +inf 7e fdatum= -> false }t
t{ 7e -inf fdatum= -> false }t
t{ -inf 7e fdatum= -> false }t
t{ +inf +inf fdatum= -> true }t
t{ +inf -inf fdatum= -> false }t
t{ -inf +inf fdatum= -> false }t
t{ -inf -inf fdatum= -> true }t
t{ +nan 7e fdatum= -> false }t
t{ -nan 7e fdatum= -> false }t
t{ 7e +nan fdatum= -> false }t
t{ 7e -nan fdatum= -> false }t
t{ +nan +nan fdatum= -> true }t
t{ -nan +nan fdatum= -> false }t
t{ +nan -nan fdatum= -> false }t
t{ -nan -nan fdatum= -> true }t
t{ +inf +nan fdatum= -> false }t
t{ -inf +nan fdatum= -> false }t
t{ +inf -nan fdatum= -> false }t
t{ -inf -nan fdatum= -> false }t
t{ +nan +inf fdatum= -> false }t
t{ -nan +inf fdatum= -> false }t
t{ +nan -inf fdatum= -> false }t
t{ -nan -inf fdatum= -> false }t
t{ 1e +inf f< -> true }t
t{ +0 fnan? -> false }t
t{ -0 fnan? -> false }t
t{ +inf fnan? -> false }t
t{ -inf fnan? -> false }t
t{ 1e fnan? -> false }t
t{ +nan fnan? -> true }t
t{ -nan fnan? -> true }t
#errors @ 0=
\ Note that the above is not airtight. We really need to know
\ that the IEEE special data are correct.
[ELSE] true [THEN]
constant VALID-FNAN?-DEFINED
TESTING F+
\ IEEE-2008 6.3
t{ +0 +0 f+ -> +0 r}t
t{ +0 -0 f+ -> +0 r}t
t{ -0 +0 f+ -> +0 r}t
t{ -0 -0 f+ -> -0 r}t
t{ +nan 2e f+ -> +nan r}t
t{ -nan 2e f+ -> -nan r}t
t{ 3e +nan f+ -> +nan r}t
t{ 3e -nan f+ -> -nan r}t
t{ +nan +nan f+ -> +nan r}t
t{ -nan +nan f+ fabs -> +nan r}t
t{ +nan -nan f+ fabs -> +nan r}t
t{ -nan -nan f+ -> -nan r}t
t{ 2e +inf f+ -> +inf r}t
t{ +inf 7e f+ -> +inf r}t
t{ 2e -inf f+ -> -inf r}t
t{ -inf 7e f+ -> -inf r}t
t{ +nan +inf f+ -> +nan r}t
t{ +inf +nan f+ -> +nan r}t
t{ +nan -inf f+ -> +nan r}t
t{ -inf +nan f+ -> +nan r}t
t{ -nan +inf f+ -> -nan r}t
t{ +inf -nan f+ -> -nan r}t
t{ -nan -inf f+ -> -nan r}t
t{ -inf -nan f+ -> -nan r}t
t{ +inf +inf f+ -> +inf r}t
t{ +inf -inf f+ fabs -> +nan r}t
t{ -inf +inf f+ fabs -> +nan r}t
t{ -inf -inf f+ -> -inf r}t
TESTING F-
t{ +0 +0 f- -> +0 r}t
t{ +0 -0 f- -> +0 r}t
t{ -0 +0 f- -> -0 r}t
t{ -0 -0 f- -> +0 r}t
t{ +nan 2e f- -> +nan r}t
t{ -nan 2e f- -> -nan r}t
t{ 3e +nan f- -> +nan r}t
t{ 3e -nan f- -> -nan r}t
t{ +nan +nan f- -> +nan r}t
t{ -nan +nan f- fabs -> +nan r}t
t{ +nan -nan f- fabs -> +nan r}t
t{ -nan -nan f- -> -nan r}t
t{ 2e +inf f- -> -inf r}t
t{ +inf 7e f- -> +inf r}t
t{ 2e -inf f- -> +inf r}t
t{ -inf 7e f- -> -inf r}t
t{ +nan +inf f- -> +nan r}t
t{ +inf +nan f- -> +nan r}t
t{ +nan -inf f- -> +nan r}t
t{ -inf +nan f- -> +nan r}t
t{ -nan +inf f- -> -nan r}t
t{ +inf -nan f- -> -nan r}t
t{ -nan -inf f- -> -nan r}t
t{ -inf -nan f- -> -nan r}t
t{ +inf +inf f- fabs -> +nan r}t
t{ +inf -inf f- -> +inf r}t
t{ -inf +inf f- -> -inf r}t
t{ -inf -inf f- fabs -> +nan r}t
TESTING F*
t{ +0 +0 f* -> +0 r}t
t{ +0 -0 f* -> -0 r}t
t{ -0 +0 f* -> -0 r}t
t{ -0 -0 f* -> +0 r}t
t{ +0 2e f* -> +0 r}t
t{ -0 2e f* -> -0 r}t
t{ +0 -2e f* -> -0 r}t
t{ -0 -2e f* -> +0 r}t
t{ 2e +0 f* -> +0 r}t
t{ 2e -0 f* -> -0 r}t
t{ -2e +0 f* -> -0 r}t
t{ -2e -0 f* -> +0 r}t
t{ +nan 2e f* -> +nan r}t
t{ -nan 2e f* -> -nan r}t
t{ 3e +nan f* -> +nan r}t
t{ 3e -nan f* -> -nan r}t
t{ +nan +nan f* -> +nan r}t
t{ -nan +nan f* fabs -> +nan r}t
t{ +nan -nan f* fabs -> +nan r}t
t{ -nan -nan f* -> -nan r}t
t{ 2e +inf f* -> +inf r}t
t{ +inf 7e f* -> +inf r}t
t{ 2e -inf f* -> -inf r}t
t{ -inf 7e f* -> -inf r}t
t{ +nan +inf f* -> +nan r}t
t{ +inf +nan f* -> +nan r}t
t{ +nan -inf f* -> +nan r}t
t{ -inf +nan f* -> +nan r}t
t{ -nan +inf f* -> -nan r}t
t{ +inf -nan f* -> -nan r}t
t{ -nan -inf f* -> -nan r}t
t{ -inf -nan f* -> -nan r}t
t{ +inf +inf f* -> +inf r}t
t{ +inf -inf f* -> -inf r}t
t{ -inf +inf f* -> -inf r}t
TESTING F/
t{ +0 +0 f/ fabs -> +nan r}t
t{ +0 -0 f/ fabs -> +nan r}t
t{ -0 +0 f/ fabs -> +nan r}t
t{ -0 -0 f/ fabs -> +nan r}t
t{ +0 2e f/ -> +0 r}t
t{ -0 2e f/ -> -0 r}t
t{ +0 -2e f/ -> -0 r}t
t{ -0 -2e f/ -> +0 r}t
t{ 2e +0 f/ -> +inf r}t
t{ 2e -0 f/ -> -inf r}t
t{ -2e +0 f/ -> -inf r}t
t{ -2e -0 f/ -> +inf r}t
t{ +nan 2e f/ -> +nan r}t
t{ -nan 2e f/ -> -nan r}t
t{ 3e +nan f/ -> +nan r}t
t{ 3e -nan f/ -> -nan r}t
t{ +nan +nan f/ -> +nan r}t
t{ -nan +nan f/ fabs -> +nan r}t
t{ +nan -nan f/ fabs -> +nan r}t
t{ -nan -nan f/ -> -nan r}t
t{ 2e +inf f/ -> +0 r}t
t{ +inf 7e f/ -> +inf r}t
t{ 2e -inf f/ -> -0 r}t
t{ -inf 7e f/ -> -inf r}t
t{ +nan +inf f/ -> +nan r}t
t{ +inf +nan f/ -> +nan r}t
t{ +nan -inf f/ -> +nan r}t
t{ -inf +nan f/ -> +nan r}t
t{ -nan +inf f/ -> -nan r}t
t{ +inf -nan f/ -> -nan r}t
t{ -nan -inf f/ -> -nan r}t
t{ -inf -nan f/ -> -nan r}t
t{ +inf +inf f/ fabs -> +nan r}t
t{ +inf -inf f/ fabs -> +nan r}t
t{ -inf +inf f/ fabs -> +nan r}t
TESTING FSQRT
t{ +0 fsqrt -> +0 r}t
t{ -0 fsqrt -> -0 r}t
t{ +inf fsqrt -> +inf r}t
t{ -inf fsqrt -> -1e fsqrt r}t
t{ +nan fsqrt -> +nan r}t
t{ -nan fsqrt -> -nan r}t
VALID-FNAN?-DEFINED [IF]
t{ -1e fsqrt fnan? -> true }t
[ELSE]
verbose @ [IF] .( NOT TESTING -1E FSQRT) cr [THEN]
[THEN]
.( NOT TESTING F*+) cr
?.errors ?.cr