]> gitweb.factorcode.org Git - factor.git/blob - basis/math/functions/functions-tests.factor
math.functions: fix divisor? to work with mixed numbers
[factor.git] / basis / math / functions / functions-tests.factor
1 USING: kernel literals math math.constants math.functions math.libm
2 math.order ranges math.private sequences tools.test math.floats.env ;
3
4 IN: math.functions.tests
5
6 { t } [ 4 4 .00000001 ~ ] unit-test
7 { t } [ 4.0000001 4.0000001 .000001 ~ ] unit-test
8 { f } [ -4.0000001 4.0000001 .00001 ~ ] unit-test
9 { t } [ -.0000000000001 0 .0000000001 ~ ] unit-test
10 { t } [ 100 101 -.9 ~ ] unit-test
11 { f } [ 100 120 -.09 ~ ] unit-test
12 { t } [ 0 0 -.9 ~ ] unit-test
13 { f } [ 0 10 -.9 ~ ] unit-test
14
15 ! Lets get the argument order correct, eh?
16 { 0.0 } [ 0.0 1.0 fatan2 ] unit-test
17 { 0.25 } [ 2.0 -2.0 fpow ] unit-test
18
19 { 4.0 } [ 16 sqrt ] unit-test
20 { 2.0 } [ 4.0 0.5 ^ ] unit-test
21 { C{ 0.0 4.0 } } [ -16 sqrt ] unit-test
22
23 { 4 } [ 2 2 ^ ] unit-test
24 { 1/4 } [ 2 -2 ^ ] unit-test
25 { t } [ 2 0.5 ^ 2 ^ 2 2.00001 between? ] unit-test
26 { t } [ e pi i* ^ real-part -1.0 = ] unit-test
27 { t } [ e pi i* ^ imaginary-part -0.00001 0.00001 between? ] unit-test
28
29 { 1/0. } [ 2.0 1024 ^ ] unit-test
30 { 0x1.0p-1024 } [ 2.0 -1024 ^ ] unit-test
31
32 { t } [ 0 0 ^ fp-nan? ] unit-test
33 { 0.0 } [ 0.0 1.0 ^ ] unit-test
34 { 1/0. } [ 0 -2 ^ ] unit-test
35 { t } [ 0 0.0 ^ fp-nan? ] unit-test
36 { t } [ 0.0 0.0 ^ fp-nan? ] unit-test
37 { 1/0. } [ 0 -2.0 ^ ] unit-test
38 { 0 } [ 0 3.0 ^ ] unit-test
39 { 0 } [ 0 3 ^ ] unit-test
40
41 : factorial ( n -- n! ) [ 1 ] [ [1..b] 1 [ * ] reduce ] if-zero ;
42
43 { 0.0 0 } [ 0 frexp ] unit-test
44 { 0.5 1 } [ 1 frexp ] unit-test
45 { -0.5 1 } [ -1 frexp ] unit-test
46 { 0.5 2 } [ 2 frexp ] unit-test
47 { -0.5 2 } [ -2 frexp ] unit-test
48 { 0.75 2 } [ 3 frexp ] unit-test
49 { -0.75 2 } [ -3 frexp ] unit-test
50 { 0.75 0 } [ 0.75 frexp ] unit-test
51 { -0.75 0 } [ -0.75 frexp ] unit-test
52 { 1/0. } [ 1/0. frexp drop ] unit-test
53 { -1/0. } [ -1/0. frexp drop ] unit-test
54 { t } [ 0/0. frexp drop fp-nan? ] unit-test
55 {  0.75 10,002 t } [  3 10,000 2^ * [ frexp ] [ bignum? ] bi ] unit-test
56 { -0.75 10,002 t } [ -3 10,000 2^ * [ frexp ] [ bignum? ] bi ] unit-test
57
58 { 0.0 } [ 0.0 1 ldexp ] unit-test
59 { -0.0 } [ -0.0 1 ldexp ] unit-test
60 { 1/0. } [ 1/0. 1 ldexp ] unit-test
61 { -1/0. } [ -1/0. 1 ldexp ] unit-test
62 { t } [ NAN: 90210 dup 1 ldexp [ fp-nan-payload ] same? ] unit-test
63 { 49152.0 } [ 12.0 12 ldexp ] unit-test
64 { 0x1.8p-9 } [ 12.0 -12 ldexp ] unit-test
65 { 49152 } [ 12 12 ldexp ] unit-test
66 { 0 } [ 12 -12 ldexp ] unit-test
67
68 { 0.0 } [ 1 log ] unit-test
69 { 0.0 } [ 1.0 log ] unit-test
70 { 1.0 } [ e log ] unit-test
71
72 { 0.0 } [ 1 e logn ] unit-test
73 { 0.0 } [ 1.0 e logn ] unit-test
74 { 1.0 } [ e e logn ] unit-test
75
76 CONSTANT: log-factorial-1000 0x1.71820d04e2eb6p12
77 CONSTANT: log10-factorial-1000 0x1.40f3593ed6f8ep11
78
79 { $ log-factorial-1000 t } [ 1000 factorial [ log ] [ bignum? ] bi ] unit-test
80 { C{ $ log-factorial-1000 $ pi } t } [ 1000 factorial neg [ log ] [ bignum? ] bi ] unit-test
81
82 { 0.0 } [ 1.0 log10 ] unit-test
83 { 1.0 } [ 10.0 log10 ] unit-test
84 { 2.0 } [ 100.0 log10 ] unit-test
85 { 3.0 } [ 1000.0 log10 ] unit-test
86 { 4.0 } [ 10000.0 log10 ] unit-test
87 { $ log10-factorial-1000 t } [ 1000 factorial [ log10 ] [ bignum? ] bi ] unit-test
88
89 { f } [ 1 e^ 0/0. 1.e-10 ~ ] unit-test
90 { f } [ 0/0. 1 e^ 1.e-10 ~ ] unit-test
91 { f } [ 1/0. 1/0. 1.e-10 ~ ] unit-test
92 { f } [ 1/0. -1/0. 1.e-10 ~ ] unit-test
93 { f } [ 1/0. 0/0. 1.e-10 ~ ] unit-test
94 { f } [ 0/0. -1/0. 1.e-10 ~ ] unit-test
95
96 { e 1.e-10 } [ 1 e^ ] unit-test~
97 { 1.0 1.e-10 } [ -1 e^ e * ] unit-test~
98
99 { 0.0 } [ 0.0 e^-1 ] unit-test
100 { -0.0 } [ -0.0 e^-1 ] unit-test
101 { 1/0. } [ 1/0. e^-1 ] unit-test
102 { -1.0 } [ -1/0. e^-1 ] unit-test
103 { -1.0 } [ -1/0. e^-1 ] unit-test
104 { t } [ NAN: 8000000000000 dup e^-1 [ fp-nan-payload ] same? ] unit-test
105 { 5e-324 } [ 5e-324 e^-1 ] unit-test
106 { 1e-20 } [ 1e-20 e^-1 ] unit-test
107 { -5e-324 } [ -5e-324 e^-1 ] unit-test
108 { -1e-20 } [ -1e-20 e^-1 ] unit-test
109 { 1.0000000000500000e-10 } [ 1e-10 e^-1 ] unit-test
110 { 22025.465794806718 } [ 10.0 e^-1 ] unit-test
111 { -9.999999999500001e-11 } [ -1e-10 e^-1 ] unit-test
112 { -0.9999546000702375 } [ -10.0 e^-1 ] unit-test
113 { -1.0 } [ -38.0 e^-1 ] unit-test
114 { -1.0 } [ -1e50 e^-1 ] unit-test
115 { 1.9424263952412558e+130 } [ 300 e^-1 ] unit-test
116 { 1.7976931346824240e+308 } [ 709.78271289328393 e^-1 ] unit-test
117 { 1/0. } [ 1000.0 e^-1 ] unit-test
118 { 1/0. } [ 1e50 e^-1 ] unit-test
119 { 1/0. } [ 1.79e308 e^-1 ] unit-test
120
121 { 1.0 } [ 0 cosh ] unit-test
122 { 1.0 } [ 0.0 cosh ] unit-test
123 { 0.0 } [ 1 acosh ] unit-test
124 { 0.0 } [ 1.0 acosh ] unit-test
125
126 { 1.0 } [ 0 cos ] unit-test
127 { 1.0 } [ 0.0 cos ] unit-test
128 { 0.0 } [ 1 acos ] unit-test
129 { 0.0 } [ 1.0 acos ] unit-test
130
131 { 0.0 } [ 0 sinh ] unit-test
132 { 0.0 } [ 0.0 sinh ] unit-test
133 { 0.0 } [ 0 asinh ] unit-test
134 { 0.0 } [ 0.0 asinh ] unit-test
135
136 { 0.0 } [ 0 sin ] unit-test
137 { 0.0 } [ 0.0 sin ] unit-test
138 { 0.0 } [ 0 asin ] unit-test
139 { 0.0 } [ 0.0 asin ] unit-test
140
141 { 0.0 } [ 0 tan ] unit-test
142 { t } [ pi 2 / tan 1.e10 > ] unit-test
143
144 { t } [ 10 atan real? ] unit-test
145 { t } [ 10.0 atan real? ] unit-test
146 { f } [ 10 atanh real? ] unit-test
147 { f } [ 10.0 atanh real? ] unit-test
148
149 { 10 1.e-10 } [ 10 asin sin ] unit-test~
150 { -100 1.e-10 } [ -100 atan tan ] unit-test~
151 { 10 1.e-10 } [ 10 asinh sinh ] unit-test~
152 { 10 1.e-10 } [ 10 atanh tanh ] unit-test~
153 { 0.5 1.e-10 } [ 0.5 atanh tanh ] unit-test~
154
155 { t } [ -1 sqrt neg dup acos cos 1.e-10 ~ ] unit-test
156
157 { t } [ 0 42 divisor? ] unit-test
158 { t } [ 42 7 divisor? ] unit-test
159 { t } [ 42 -7 divisor? ] unit-test
160 { t } [ 42 42 divisor? ] unit-test
161 { f } [ 42 16 divisor? ] unit-test
162 { t } [ 42.0 1 divisor? ] unit-test
163
164 { 3 } [ 5 7 mod-inv ] unit-test
165 { 78572682077 } [ 234829342 342389423843 mod-inv ] unit-test
166
167 [ 2 10 mod-inv ] must-fail
168
169 { t } [ 15 37 137 ^mod 15 37 ^ 137 mod = ] unit-test
170
171 { t } [ 0 0 ^ fp-nan? ] unit-test
172 { 1 } [ 10 0 ^ ] unit-test
173 { 1/8 } [ 1/2 3 ^ ] unit-test
174 { 1/8 } [ 2 -3 ^ ] unit-test
175 { t } [ 1 100 shift 2 100 ^ = ] unit-test
176
177 { 1 } [ 7/8 ceiling ] unit-test
178 { 2 } [ 3/2 ceiling ] unit-test
179 { 0 } [ -7/8 ceiling ] unit-test
180 { -1 } [ -3/2 ceiling ] unit-test
181
182 { 4.0 } [ 4.5 truncate ] unit-test
183 { 4.0 } [ 4.5 floor ] unit-test
184 { 5.0 } [ 4.5 ceiling ] unit-test
185
186 { -4.0 } [ -4.5 truncate ] unit-test
187 { -5.0 } [ -4.5 floor ] unit-test
188 { -4.0 } [ -4.5 ceiling ] unit-test
189
190 { t } [ -0.3 truncate double>bits 0.0 double>bits = ] unit-test
191 { t } [ -0.3 ceiling double>bits -0.0 double>bits = ] unit-test
192 { t } [ 0.3 floor double>bits 0.0 double>bits = ] unit-test
193 { t } [ 0.3 truncate double>bits 0.0 double>bits = ] unit-test
194
195 { -4.0 } [ -4.0 truncate ] unit-test
196 { -4.0 } [ -4.0 floor ] unit-test
197 { -4.0 } [ -4.0 ceiling ] unit-test
198
199 ! first floats without fractional part
200 { 0x1.0p52 } [ 0x1.0p52 truncate ] unit-test
201 { 0x1.0000000000001p52 } [ 0x1.0000000000001p52 truncate ] unit-test
202 { -0x1.0p52 } [ -0x1.0p52 truncate ] unit-test
203 { -0x1.0000000000001p52 } [ -0x1.0000000000001p52 truncate ] unit-test
204
205 { -5 } [ -9/2 round ] unit-test
206 { -4 } [ -22/5 round ] unit-test
207 { 5 } [ 9/2 round ] unit-test
208 { 4 } [ 22/5 round ] unit-test
209
210 { -5.0 } [ -4.5 round ] unit-test
211 { -4.0 } [ -4.4 round ] unit-test
212 { 5.0 } [ 4.5 round ] unit-test
213 { 4.0 } [ 4.4 round ] unit-test
214
215 { -1 } [ -3/5 round ] unit-test
216 { -1 } [ -1/2 round ] unit-test
217 { 0 } [ -2/5 round ] unit-test
218 { 0 } [ 2/5 round ] unit-test
219 { 1 } [ 1/2 round ] unit-test
220 { 1 } [ 3/5 round ] unit-test
221
222 { t } [ -0.3 round double>bits 0.0 double>bits = ] unit-test
223 { t } [ 0.3 round double>bits 0.0 double>bits = ] unit-test
224
225 ! A signaling NaN should raise an exception
226 ! XXX: disabling to get linux32 binary
227 ! HACK: bug in factor or in vmware?
228 ! TODO: fix this test on linux32 vmware
229 !  { { +fp-invalid-operation+ } } [ [ NAN: 4000000000000 truncate drop ] collect-fp-exceptions ] unit-test
230 { { +fp-invalid-operation+ } } [ [ NAN: 4000000000000 round drop ] collect-fp-exceptions ] unit-test
231 { { +fp-invalid-operation+ } } [ [ NAN: 4000000000000 ceiling drop ] collect-fp-exceptions ] unit-test
232 { { +fp-invalid-operation+ } } [ [ NAN: 4000000000000 floor drop ] collect-fp-exceptions ] unit-test
233
234 { -5 } [ -4-3/5 round-to-even ] unit-test
235 { -4 } [ -4-1/2 round-to-even ] unit-test
236 { -4 } [ -4-2/5 round-to-even ] unit-test
237 { 5 } [ 4+3/5 round-to-even ] unit-test
238 { 4 } [ 4+1/2 round-to-even ] unit-test
239 { 4 } [ 4+2/5 round-to-even ] unit-test
240 { -5.0 } [ -4.6 round-to-even ] unit-test
241 { -4.0 } [ -4.5 round-to-even ] unit-test
242 { -4.0 } [ -4.4 round-to-even ] unit-test
243 { 5.0 } [ 4.6 round-to-even ] unit-test
244 { 4.0 } [ 4.5 round-to-even ] unit-test
245 { 4.0 } [ 4.4 round-to-even ] unit-test
246
247 { -5 } [ -4-3/5 round-to-odd ] unit-test
248 { -5 } [ -4-1/2 round-to-odd ] unit-test
249 { -4 } [ -4-2/5 round-to-odd ] unit-test
250 { 5 } [ 4+3/5 round-to-odd ] unit-test
251 { 5 } [ 4+1/2 round-to-odd ] unit-test
252 { 4 } [ 4+2/5 round-to-odd ] unit-test
253 { -5.0 } [ -4.6 round-to-odd ] unit-test
254 { -5.0 } [ -4.5 round-to-odd ] unit-test
255 { -4.0 } [ -4.4 round-to-odd ] unit-test
256 { 5.0 } [ 4.6 round-to-odd ] unit-test
257 { 5.0 } [ 4.5 round-to-odd ] unit-test
258 { 4.0 } [ 4.4 round-to-odd ] unit-test
259
260 { 6 59967 } [ 3837888 factor-2s ] unit-test
261 { 6 -59967 } [ -3837888 factor-2s ] unit-test
262
263 { 1 } [
264     183009416410801897
265     1067811677921310779
266     2135623355842621559
267     ^mod
268 ] unit-test
269
270 { 1 } [
271     183009416410801897
272     1067811677921310779
273     2135623355842621559
274     [ >bignum ] tri@ ^mod
275 ] unit-test
276
277 { 1.0  } [ 1.0 2.5 0.0 lerp ] unit-test
278 { 2.5  } [ 1.0 2.5 1.0 lerp ] unit-test
279 { 1.75 } [ 1.0 2.5 0.5 lerp ] unit-test
280
281 { C{ 1 2 } } [ C{ 1 2 } 1 ^ ] unit-test
282
283 { { t t t } } [
284     3 3 roots {
285         1.442249570307408
286         C{ -0.7211247851537038 1.249024766483407 }
287         C{ -0.7211247851537049 -1.249024766483406 }
288     } [ .01 ~ ] 2map
289 ] unit-test
290
291 { t } [ 3 15 roots [ 15 ^ 3 .01 ~ ] all? ] unit-test
292
293 { .5 } [ 0 sigmoid ] unit-test
294 { t } [ 0 [ sigmoid logit ] keep .000001 ~ ] unit-test
295
296 { 1 } [ 12 signum ] unit-test
297 { -1 } [ -5.0 signum ] unit-test
298 { 0 } [ 0 signum ] unit-test
299 { t } [ C{ 3.0 -1.5 } signum C{ 0.8944271909999157 -0.4472135954999579 } 1e-10 ~ ] unit-test
300
301 { 1.0 } [ 1 2 copysign ] unit-test
302 { -1.0 } [ 1 -2 copysign ] unit-test
303 { 1.0 } [ -1 0 copysign ] unit-test
304 { -0.0 } [ 0 -1.0 copysign ] unit-test
305 { -1.0 } [ -1 -0.0 copysign ] unit-test
306 { 1.5 } [ -1.5 2 copysign ] unit-test
307 { -1.5 } [ -1.5 -2 copysign ] unit-test
308
309 [ -1 integer-sqrt ] must-fail
310 { 0 } [ 0 integer-sqrt ] unit-test
311 { 3 } [ 12 integer-sqrt ] unit-test
312 { 4 } [ 16 integer-sqrt ] unit-test
313 { 44 } [ 2019 integer-sqrt ] unit-test
314
315 [ -576460752303423489 integer-log10 ] [ positive-number-expected? ] must-fail-with
316 [ -123124 integer-log10 ] [ positive-number-expected? ] must-fail-with
317 [ -1/2 integer-log10 ] [ positive-number-expected? ] must-fail-with
318 [ 0 integer-log10 ] [ positive-number-expected? ] must-fail-with
319
320 { 0 } [ 1 integer-log10 ] unit-test
321 { 0 } [ 5 integer-log10 ] unit-test
322 { 0 } [ 9 integer-log10 ] unit-test
323 { 1 } [ 10 integer-log10 ] unit-test
324 { 1 } [ 99 integer-log10 ] unit-test
325 { 2 } [ 100 integer-log10 ] unit-test
326 { 2 } [ 101 integer-log10 ] unit-test
327 { 2 } [ 101 integer-log10 ] unit-test
328 { 8 } [ 134217726 integer-log10 ] unit-test
329 { 8 } [ 134217727 integer-log10 ] unit-test
330 { 8 } [ 134217728 integer-log10 ] unit-test
331 { 8 } [ 134217729 integer-log10 ] unit-test
332 { 8 } [ 999999999 integer-log10 ] unit-test
333 { 9 } [ 1000000000 integer-log10 ] unit-test
334 { 9 } [ 1000000001 integer-log10 ] unit-test
335 { 17 } [ 576460752303423486 integer-log10 ] unit-test
336 { 17 } [ 576460752303423487 integer-log10 ] unit-test
337 { 17 } [ 576460752303423488 integer-log10 ] unit-test
338 { 17 } [ 576460752303423489 integer-log10 ] unit-test
339 { 17 } [ 999999999999999999 integer-log10 ] unit-test
340 { 18 } [ 1000000000000000000 integer-log10 ] unit-test
341 { 18 } [ 1000000000000000001 integer-log10 ] unit-test
342 { 999 } [ 1000 10^ 1 - integer-log10 ] unit-test
343 { 1000 } [ 1000 10^ integer-log10 ] unit-test
344 { 1000 } [ 1000 10^ 1 + integer-log10 ] unit-test
345
346 { 0 } [ 9+1/2 integer-log10 ] unit-test
347 { 1 } [ 10 integer-log10 ] unit-test
348 { 1 } [ 10+1/2 integer-log10 ] unit-test
349 { 999 } [ 1000 10^ 1/2 - integer-log10 ] unit-test
350 { 1000 } [ 1000 10^ integer-log10 ] unit-test
351 { 1000 } [ 1000 10^ 1/2 + integer-log10 ] unit-test
352 { -1000 } [ 1000 10^ 1/2 - recip integer-log10 ] unit-test
353 { -1000 } [ 1000 10^ recip integer-log10 ] unit-test
354 { -1001 } [ 1000 10^ 1/2 + recip integer-log10 ] unit-test
355 { -1 } [ 8/10 integer-log10 ] unit-test
356 { -1 } [ 4/10 integer-log10 ] unit-test
357 { -1 } [ 1/10 integer-log10 ] unit-test
358 { -2 } [ 1/11 integer-log10 ] unit-test
359
360 { 99 } [ 100 2^ 1/2 - integer-log2 ] unit-test
361 { 100 } [ 100 2^ integer-log2 ] unit-test
362 { 100 } [ 100 2^ 1/2 + integer-log2 ] unit-test
363 { -100 } [ 100 2^ 1/2 - recip integer-log2 ] unit-test
364 { -100 } [ 100 2^ recip integer-log2 ] unit-test
365 { -101 } [ 100 2^ 1/2 + recip integer-log2 ] unit-test
366 { -1 } [ 8/10 integer-log2 ] unit-test
367 { -2 } [ 4/10 integer-log2 ] unit-test
368 { -3 } [ 2/10 integer-log2 ] unit-test
369 { -4 } [ 1/10 integer-log2 ] unit-test