Revert "lists: Add list literal doc example."
[factor.git] / basis / math / functions / functions-tests.factor
blobda9630d33f0ff0878023f1422649c2178f032520
1 USING: kernel literals math math.constants math.functions math.libm
2 math.order math.ranges math.private sequences tools.test math.floats.env ;
4 IN: math.functions.tests
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
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
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
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
29 { 1/0. } [ 2.0 1024 ^ ] unit-test
30 { 0x1.0p-1024 } [ 2.0 -1024 ^ ] unit-test
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
41 : factorial ( n -- n! ) [ 1 ] [ [1,b] 1 [ * ] reduce ] if-zero ;
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
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
68 { 0.0 } [ 1 log ] unit-test
69 { 0.0 } [ 1.0 log ] unit-test
70 { 1.0 } [ e log ] unit-test
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
76 CONSTANT: log-factorial-1000 0x1.71820d04e2eb6p12
77 CONSTANT: log10-factorial-1000 0x1.40f3593ed6f8ep11
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
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
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
96 { e 1.e-10 } [ 1 e^ ] unit-test~
97 { 1.0 1.e-10 } [ -1 e^ e * ] unit-test~
99 { 1.0 } [ 0 cosh ] unit-test
100 { 1.0 } [ 0.0 cosh ] unit-test
101 { 0.0 } [ 1 acosh ] unit-test
102 { 0.0 } [ 1.0 acosh ] unit-test
104 { 1.0 } [ 0 cos ] unit-test
105 { 1.0 } [ 0.0 cos ] unit-test
106 { 0.0 } [ 1 acos ] unit-test
107 { 0.0 } [ 1.0 acos ] unit-test
109 { 0.0 } [ 0 sinh ] unit-test
110 { 0.0 } [ 0.0 sinh ] unit-test
111 { 0.0 } [ 0 asinh ] unit-test
112 { 0.0 } [ 0.0 asinh ] unit-test
114 { 0.0 } [ 0 sin ] unit-test
115 { 0.0 } [ 0.0 sin ] unit-test
116 { 0.0 } [ 0 asin ] unit-test
117 { 0.0 } [ 0.0 asin ] unit-test
119 { 0.0 } [ 0 tan ] unit-test
120 { t } [ pi 2 / tan 1.e10 > ] unit-test
122 { t } [ 10 atan real? ] unit-test
123 { t } [ 10.0 atan real? ] unit-test
124 { f } [ 10 atanh real? ] unit-test
125 { f } [ 10.0 atanh real? ] unit-test
127 { 10 1.e-10 } [ 10 asin sin ] unit-test~
128 { -100 1.e-10 } [ -100 atan tan ] unit-test~
129 { 10 1.e-10 } [ 10 asinh sinh ] unit-test~
130 { 10 1.e-10 } [ 10 atanh tanh ] unit-test~
131 { 0.5 1.e-10 } [ 0.5 atanh tanh ] unit-test~
133 { t } [ -1 sqrt neg dup acos cos 1.e-10 ~ ] unit-test
135 { t } [ 0 42 divisor? ] unit-test
136 { t } [ 42 7 divisor? ] unit-test
137 { t } [ 42 -7 divisor? ] unit-test
138 { t } [ 42 42 divisor? ] unit-test
139 { f } [ 42 16 divisor? ] unit-test
141 { 3 } [ 5 7 mod-inv ] unit-test
142 { 78572682077 } [ 234829342 342389423843 mod-inv ] unit-test
144 [ 2 10 mod-inv ] must-fail
146 { t } [ 15 37 137 ^mod 15 37 ^ 137 mod = ] unit-test
148 { t } [ 0 0 ^ fp-nan? ] unit-test
149 { 1 } [ 10 0 ^ ] unit-test
150 { 1/8 } [ 1/2 3 ^ ] unit-test
151 { 1/8 } [ 2 -3 ^ ] unit-test
152 { t } [ 1 100 shift 2 100 ^ = ] unit-test
154 { 1 } [ 7/8 ceiling ] unit-test
155 { 2 } [ 3/2 ceiling ] unit-test
156 { 0 } [ -7/8 ceiling ] unit-test
157 { -1 } [ -3/2 ceiling ] unit-test
159 { 4.0 } [ 4.5 truncate ] unit-test
160 { 4.0 } [ 4.5 floor ] unit-test
161 { 5.0 } [ 4.5 ceiling ] unit-test
163 { -4.0 } [ -4.5 truncate ] unit-test
164 { -5.0 } [ -4.5 floor ] unit-test
165 { -4.0 } [ -4.5 ceiling ] unit-test
167 { t } [ -0.3 truncate double>bits 0.0 double>bits = ] unit-test
168 { t } [ -0.3 ceiling double>bits -0.0 double>bits = ] unit-test
169 { t } [ 0.3 floor double>bits 0.0 double>bits = ] unit-test
170 { t } [ 0.3 truncate double>bits 0.0 double>bits = ] unit-test
172 { -4.0 } [ -4.0 truncate ] unit-test
173 { -4.0 } [ -4.0 floor ] unit-test
174 { -4.0 } [ -4.0 ceiling ] unit-test
176 ! first floats without fractional part
177 { 0x1.0p52 } [ 0x1.0p52 truncate ] unit-test
178 { 0x1.0000000000001p52 } [ 0x1.0000000000001p52 truncate ] unit-test
179 { -0x1.0p52 } [ -0x1.0p52 truncate ] unit-test
180 { -0x1.0000000000001p52 } [ -0x1.0000000000001p52 truncate ] unit-test
182 { -5 } [ -9/2 round ] unit-test
183 { -4 } [ -22/5 round ] unit-test
184 { 5 } [ 9/2 round ] unit-test
185 { 4 } [ 22/5 round ] unit-test
187 { -5.0 } [ -4.5 round ] unit-test
188 { -4.0 } [ -4.4 round ] unit-test
189 { 5.0 } [ 4.5 round ] unit-test
190 { 4.0 } [ 4.4 round ] unit-test
192 { -1 } [ -3/5 round ] unit-test
193 { -1 } [ -1/2 round ] unit-test
194 { 0 } [ -2/5 round ] unit-test
195 { 0 } [ 2/5 round ] unit-test
196 { 1 } [ 1/2 round ] unit-test
197 { 1 } [ 3/5 round ] unit-test
199 { t } [ -0.3 round double>bits 0.0 double>bits = ] unit-test
200 { t } [ 0.3 round double>bits 0.0 double>bits = ] unit-test
202 ! A signaling NaN should raise an exception
203 ! XXX: disabling to get linux32 binary
204 ! HACK: bug in factor or in vmware?
205 ! TODO: fix this test on linux32 vmware
206 !  { { +fp-invalid-operation+ } } [ [ NAN: 4000000000000 truncate drop ] collect-fp-exceptions ] unit-test
207 { { +fp-invalid-operation+ } } [ [ NAN: 4000000000000 round drop ] collect-fp-exceptions ] unit-test
208 { { +fp-invalid-operation+ } } [ [ NAN: 4000000000000 ceiling drop ] collect-fp-exceptions ] unit-test
209 { { +fp-invalid-operation+ } } [ [ NAN: 4000000000000 floor drop ] collect-fp-exceptions ] unit-test
211 { -5 } [ -4-3/5 round-to-even ] unit-test
212 { -4 } [ -4-1/2 round-to-even ] unit-test
213 { -4 } [ -4-2/5 round-to-even ] unit-test
214 { 5 } [ 4+3/5 round-to-even ] unit-test
215 { 4 } [ 4+1/2 round-to-even ] unit-test
216 { 4 } [ 4+2/5 round-to-even ] unit-test
217 { -5.0 } [ -4.6 round-to-even ] unit-test
218 { -4.0 } [ -4.5 round-to-even ] unit-test
219 { -4.0 } [ -4.4 round-to-even ] unit-test
220 { 5.0 } [ 4.6 round-to-even ] unit-test
221 { 4.0 } [ 4.5 round-to-even ] unit-test
222 { 4.0 } [ 4.4 round-to-even ] unit-test
224 { -5 } [ -4-3/5 round-to-odd ] unit-test
225 { -5 } [ -4-1/2 round-to-odd ] unit-test
226 { -4 } [ -4-2/5 round-to-odd ] unit-test
227 { 5 } [ 4+3/5 round-to-odd ] unit-test
228 { 5 } [ 4+1/2 round-to-odd ] unit-test
229 { 4 } [ 4+2/5 round-to-odd ] unit-test
230 { -5.0 } [ -4.6 round-to-odd ] unit-test
231 { -5.0 } [ -4.5 round-to-odd ] unit-test
232 { -4.0 } [ -4.4 round-to-odd ] unit-test
233 { 5.0 } [ 4.6 round-to-odd ] unit-test
234 { 5.0 } [ 4.5 round-to-odd ] unit-test
235 { 4.0 } [ 4.4 round-to-odd ] unit-test
237 { 6 59967 } [ 3837888 factor-2s ] unit-test
238 { 6 -59967 } [ -3837888 factor-2s ] unit-test
240 { 1 } [
241     183009416410801897
242     1067811677921310779
243     2135623355842621559
244     ^mod
245 ] unit-test
247 { 1 } [
248     183009416410801897
249     1067811677921310779
250     2135623355842621559
251     [ >bignum ] tri@ ^mod
252 ] unit-test
254 { 1.0  } [ 1.0 2.5 0.0 lerp ] unit-test
255 { 2.5  } [ 1.0 2.5 1.0 lerp ] unit-test
256 { 1.75 } [ 1.0 2.5 0.5 lerp ] unit-test
258 { C{ 1 2 } } [ C{ 1 2 } 1 ^ ] unit-test
260 { { t t t } } [
261     3 3 roots {
262         1.442249570307408
263         C{ -0.7211247851537038 1.249024766483407 }
264         C{ -0.7211247851537049 -1.249024766483406 }
265     } [ .01 ~ ] 2map
266 ] unit-test
268 { t } [ 3 15 roots [ 15 ^ 3 .01 ~ ] all? ] unit-test
270 { .5 } [ 0 sigmoid ] unit-test
272 { 1 } [ 12 signum ] unit-test
273 { -1 } [ -5.0 signum ] unit-test
274 { 0 } [ 0 signum ] unit-test
275 { t } [ C{ 3.0 -1.5 } signum C{ 0.8944271909999157 -0.4472135954999579 } 1e-10 ~ ] unit-test
277 { 1.0 } [ 1 2 copysign ] unit-test
278 { -1.0 } [ 1 -2 copysign ] unit-test
279 { 1.0 } [ -1 0 copysign ] unit-test
280 { -0.0 } [ 0 -1.0 copysign ] unit-test
281 { -1.0 } [ -1 -0.0 copysign ] unit-test
282 { 1.5 } [ -1.5 2 copysign ] unit-test
283 { -1.5 } [ -1.5 -2 copysign ] unit-test