]> gitweb.factorcode.org Git - factor.git/blob - core/math/integers/integers-tests.factor
factor: Retrying on the unit tests. Also normalize some syntax with FUNCTION:.
[factor.git] / core / math / integers / integers-tests.factor
1 USING: kernel math math.functions math.order namespaces
2 prettyprint math.private continuations tools.test sequences
3 random prettyprint.config ;
4 IN: math.integers.tests
5
6 10 number-base [
7     [ "-8" ] [ -8 unparse ] unit-test
8 ] with-variable
9
10 { t } [ 0 fixnum? ] unit-test
11 { t } [ 31415 number? ] unit-test
12 { t } [ 31415 >bignum number? ] unit-test
13 { t } [ 2345621 fixnum? ] unit-test
14
15 { t } [ 2345621 dup >bignum >fixnum = ] unit-test
16
17 { t } [ 0 >fixnum 0 >bignum = ] unit-test
18 { f } [ 0 >fixnum 1 >bignum = ] unit-test
19 { f } [ 1 >bignum 0 >bignum = ] unit-test
20 { t } [ 0 >bignum 0 >fixnum = ] unit-test
21
22 { t } [ 0 >bignum bignum? ] unit-test
23 { f } [ 0 >fixnum bignum? ] unit-test
24 { f } [ 0 >fixnum bignum? ] unit-test
25 { t } [ 0 >fixnum fixnum? ] unit-test
26
27 { -1 } [ 1 neg ] unit-test
28 { -1 } [ 1 >bignum neg ] unit-test
29 { 134217728 } [ -134217728 >fixnum -1 * ] unit-test
30 { 134217728 } [ -134217728 >fixnum neg ] unit-test
31
32 { 9 3 } [ 93 10 /mod ] unit-test
33 { 9 3 } [ 93 >bignum 10 /mod ] unit-test
34
35 { 5 } [ 2 >bignum 3 >bignum + ] unit-test
36
37 { -10000000001981284352 } [
38     -10000000000000000000
39     -0x100000000 bitand
40 ] unit-test
41
42 { 9999999997686317056 } [
43     10000000000000000000
44     -0x100000000 bitand
45 ] unit-test
46
47 { 4294967296 } [
48     -10000000000000000000
49     0x100000000 bitand
50 ] unit-test
51
52 { 0 } [
53     10000000000000000000
54     0x100000000 bitand
55 ] unit-test
56
57 { -1 } [ -1 >bignum >fixnum ] unit-test
58
59 10 number-base [
60     [ "8589934592" ]
61     [ 134217728 dup + dup + dup + dup + dup + dup + unparse ]
62     unit-test
63 ] with-variable
64
65 { 7 } [ 255 log2 ] unit-test
66 { 8 } [ 256 log2 ] unit-test
67 { 8 } [ 257 log2 ] unit-test
68 { 0 } [ 1   log2 ] unit-test
69
70 { 7 } [ 255 >bignum log2 ] unit-test
71 { 8 } [ 256 >bignum log2 ] unit-test
72 { 8 } [ 257 >bignum log2 ] unit-test
73 { 0 } [ 1   >bignum log2 ] unit-test
74
75 { f } [ 0b1101 -1 bit? ] unit-test
76 { t } [ 0b1101 0 bit? ] unit-test
77 { f } [ 0b1101 1 bit? ] unit-test
78 { t } [ 0b1101 2 bit? ] unit-test
79 { t } [ 0b1101 3 bit? ] unit-test
80 { f } [ 0b1101 4 bit? ] unit-test
81 { f } [ 0b1101 1000 bit? ] unit-test
82
83 { f } [ 0b1101 >bignum -1 bit? ] unit-test
84 { t } [ 0b1101 >bignum 0 bit? ] unit-test
85 { f } [ 0b1101 >bignum 1 bit? ] unit-test
86 { t } [ 0b1101 >bignum 2 bit? ] unit-test
87 { t } [ 0b1101 >bignum 3 bit? ] unit-test
88 { f } [ 0b1101 >bignum 4 bit? ] unit-test
89 { f } [ 0b1101 >bignum 1000 bit? ] unit-test
90
91 { t } [ -0b1101 -1 bit? ] unit-test
92 { t } [ -0b1101 0 bit? ] unit-test
93 { t } [ -0b1101 1 bit? ] unit-test
94 { f } [ -0b1101 2 bit? ] unit-test
95 { f } [ -0b1101 3 bit? ] unit-test
96 { t } [ -0b1101 4 bit? ] unit-test
97 { t } [ -0b1101 1000 bit? ] unit-test
98
99 { t } [ -0b1101 >bignum -1 bit? ] unit-test
100 { t } [ -0b1101 >bignum 0 bit? ] unit-test
101 { t } [ -0b1101 >bignum 1 bit? ] unit-test
102 { f } [ -0b1101 >bignum 2 bit? ] unit-test
103 { f } [ -0b1101 >bignum 3 bit? ] unit-test
104 { t } [ -0b1101 >bignum 4 bit? ] unit-test
105 { t } [ -0b1101 >bignum 1000 bit? ] unit-test
106
107 { t } [ 1067811677921310779 >bignum 59 bit? ] unit-test
108
109 { 2 } [ 0 next-power-of-2 ] unit-test
110 { 2 } [ 1 next-power-of-2 ] unit-test
111 { 2 } [ 2 next-power-of-2 ] unit-test
112 { 4 } [ 3 next-power-of-2 ] unit-test
113 { 16 } [ 13 next-power-of-2 ] unit-test
114 { 16 } [ 16 next-power-of-2 ] unit-test
115
116 { 134217728 } [ -134217728 >fixnum -1 /i ] unit-test
117 { 134217728 0 } [ -134217728 >fixnum -1 /mod ] unit-test
118 { 0 } [ -1 -134217728 >fixnum /i ] unit-test
119 { 4420880996869850977 } [ 13262642990609552931 3 /i ] unit-test
120 { 0 -1 } [ -1 -134217728 >fixnum /mod ] unit-test
121 { 0 -1 } [ -1 -134217728 >bignum /mod ] unit-test
122 { 14355 } [ 1591517158873146351817850880000000 32769 mod ] unit-test
123 { 8 530505719624382123 } [ 13262642990609552931 1591517158873146351 /mod ] unit-test
124 { 8 } [ 13262642990609552931 1591517158873146351 /i ] unit-test
125 { 530505719624382123 } [ 13262642990609552931 1591517158873146351 mod ] unit-test
126
127 { -351382792 } [ -43922849 3 shift ] unit-test
128
129 { t } [ 0 zero? ] unit-test
130 { f } [ 30 zero? ] unit-test
131 { t } [ 0 >bignum zero? ] unit-test
132
133 { 2147483632 } [ 134217727 >fixnum 16 fixnum* ] unit-test
134
135 { 23603949310011464311086123800853779733506160743636399259558684142844552151041 }
136 [
137     1957739506503920732625800353008742584087090810400921800808997218266517557963281171906190947801528098188887586755474449585677502695226712388326288208691204
138     79562815144503850065234921197651376510595262628033069372760833939060637564931
139     bignum-mod
140 ] unit-test
141
142 ! We don't care if this fails or returns 0 (its CPU-specific)
143 ! as long as it doesn't crash
144 { } [ [ 0 0 /i drop ] ignore-errors ] unit-test
145 { } [ [ 100000000000000000 0 /i drop ] ignore-errors ] unit-test
146
147 { -2 } [ 1 bitnot ] unit-test
148 { -2 } [ 1 >bignum bitnot ] unit-test
149 { -2 } [ 1 >bignum bitnot ] unit-test
150 { 0 } [ 123 dup bitnot bitand ] unit-test
151 { 0 } [ 123 >bignum dup bitnot bitand ] unit-test
152 { 0 } [ 123 dup bitnot >bignum bitand ] unit-test
153 { 0 } [ 123 dup bitnot bitand >bignum ] unit-test
154 { -1 } [ 123 dup bitnot bitor ] unit-test
155 { -1 } [ 123 >bignum dup bitnot bitor ] unit-test
156 { -1 } [ 123 dup bitnot >bignum bitor ] unit-test
157 { -1 } [ 123 dup bitnot bitor >bignum ] unit-test
158 { -1 } [ 123 dup bitnot bitxor ] unit-test
159 { -1 } [ 123 >bignum dup bitnot bitxor ] unit-test
160 { -1 } [ 123 dup bitnot >bignum bitxor ] unit-test
161 { -1 } [ 123 dup bitnot bitxor >bignum ] unit-test
162 { 4 } [ 4 7 bitand ] unit-test
163
164 { 256 } [ 65536 -8 shift ] unit-test
165 { 256 } [ 65536 >bignum -8 shift ] unit-test
166 { 256 } [ 65536 -8 >bignum shift ] unit-test
167 { 256 } [ 65536 >bignum -8 >bignum shift ] unit-test
168 { 4294967296 } [ 1 16 shift 16 shift ] unit-test
169 { 4294967296 } [ 1 32 shift ] unit-test
170 { 1267650600228229401496703205376 } [ 1 100 shift ] unit-test
171
172 { t } [ 1 26 shift fixnum? ] unit-test
173
174 { t } [
175     t
176     [ 27 28 29 30 31 32 59 60 61 62 63 64 ]
177     [
178         1 over shift swap 1 >bignum swap shift = and
179     ] each
180 ] unit-test
181
182 { t } [
183     t
184     [ 27 28 29 30 31 32 59 60 61 62 63 64 ]
185     [
186         -1 over shift swap -1 >bignum swap shift = and
187     ] each
188 ] unit-test
189
190 { 12 } [ 11 4 align ] unit-test
191 { 12 } [ 12 4 align ] unit-test
192 { 10 } [ 10 2 align ] unit-test
193 { 14 } [ 13 2 align ] unit-test
194 { 11 } [ 11 1 align ] unit-test
195
196 { t } [ 256 power-of-2? ] unit-test
197 { f } [ 123 power-of-2? ] unit-test
198
199 { f } [ -128 power-of-2? ] unit-test
200 { f } [ 0 power-of-2? ] unit-test
201 { t } [ 1 power-of-2? ] unit-test
202
203 : ratio>float ( a b -- f ) [ >bignum ] bi@ /f ;
204
205 { 5. } [ 5 1 ratio>float ] unit-test
206 { 4. } [ 4 1 ratio>float ] unit-test
207 { 2. } [ 2 1 ratio>float ] unit-test
208 { .5 } [ 1 2 ratio>float ] unit-test
209 { .75 } [ 3 4 ratio>float ] unit-test
210 { 1. } [ 2000 2^ 2000 2^ 1 + ratio>float ] unit-test
211 { -1. } [ 2000 2^ neg 2000 2^ 1 + ratio>float ] unit-test
212 { 0.4 } [ 6 15 ratio>float ] unit-test
213
214 { 0x3fe553522d230931 }
215 [ 61967020039 92984792073 ratio>float double>bits ] unit-test
216
217 : random-integer ( -- n )
218     32 random-bits
219     { t f } random [ neg ] when
220     { t f } random [ >bignum ] when ;
221
222 { t } [
223     10000 [
224         drop
225         random-integer
226         random-integer
227         [ >float / ] [ /f ] 2bi 0.1 ~
228     ] all-integers?
229 ] unit-test
230
231 ! Ensure that /f is accurate for fixnums > 2^53 on 64-bit platforms
232 { 0x1.758bec11492f9p-54 } [ 1 12345678901234567 /f ] unit-test
233 { -0x1.758bec11492f9p-54 } [ 1 -12345678901234567 /f ] unit-test
234
235 ! Ensure that /f rounds to nearest and not to zero
236 { 0x1.0p55 } [ 0x7f,ffff,ffff,ffff >bignum 1 /f ] unit-test
237 { 0x1.0p55 } [ -0x7f,ffff,ffff,ffff >bignum -1 /f ] unit-test
238 { -0x1.0p55 } [ -0x7f,ffff,ffff,ffff >bignum 1 /f ] unit-test
239 { -0x1.0p55 } [ 0x7f,ffff,ffff,ffff >bignum -1 /f ] unit-test
240
241 { 0x1.0000,0000,0000,0p56 } [ 0x100,0000,0000,0007 >bignum 1 /f ] unit-test
242 { 0x1.0000,0000,0000,0p56 } [ -0x100,0000,0000,0007 >bignum -1 /f ] unit-test
243 { 0x1.0000,0000,0000,0p120 } [ 0x100,0000,0000,0007,FFFF,FFFF,FFFF,FFFF >bignum 1 /f ] unit-test
244 { 0x1.0000,0000,0000,0p120 } [ -0x100,0000,0000,0007,FFFF,FFFF,FFFF,FFFF >bignum -1 /f ] unit-test
245 { 0x1.0000,0000,0000,0p56 } [ 0x100,0000,0000,0008 >bignum 1 /f ] unit-test
246 { 0x1.0000,0000,0000,0p56 } [ -0x100,0000,0000,0008 >bignum -1 /f ] unit-test
247 { 0x1.0000,0000,0000,1p56 } [ 0x100,0000,0000,0009 >bignum 1 /f ] unit-test
248 { 0x1.0000,0000,0000,1p56 } [ -0x100,0000,0000,0009 >bignum -1 /f ] unit-test
249 { 0x1.0000,0000,0000,1p120 } [ 0x100,0000,0000,0008,0000,0000,0000,0001 >bignum 1 /f ] unit-test
250 { 0x1.0000,0000,0000,1p120 } [ -0x100,0000,0000,0008,0000,0000,0000,0001 >bignum -1 /f ] unit-test
251
252 ! Ensure that /f rounds to even on tie
253 { 0x1.0000,0000,0000,1p56 } [ 0x100,0000,0000,0017 >bignum 1 /f ] unit-test
254 { 0x1.0000,0000,0000,1p56 } [ -0x100,0000,0000,0017 >bignum -1 /f ] unit-test
255 { 0x1.0000,0000,0000,1p120 } [ 0x100,0000,0000,0017,FFFF,FFFF,FFFF,FFFF >bignum 1 /f ] unit-test
256 { 0x1.0000,0000,0000,1p120 } [ -0x100,0000,0000,0017,FFFF,FFFF,FFFF,FFFF >bignum -1 /f ] unit-test
257 { 0x1.0000,0000,0000,2p56 } [ 0x100,0000,0000,0018 >bignum 1 /f ] unit-test
258 { 0x1.0000,0000,0000,2p56 } [ -0x100,0000,0000,0018 >bignum -1 /f ] unit-test
259 { 0x1.0000,0000,0000,2p56 } [ 0x100,0000,0000,0019 >bignum 1 /f ] unit-test
260 { 0x1.0000,0000,0000,2p56 } [ -0x100,0000,0000,0019 >bignum -1 /f ] unit-test
261 { 0x1.0000,0000,0000,2p120 } [ 0x100,0000,0000,0018,0000,0000,0000,0001 >bignum 1 /f ] unit-test
262 { 0x1.0000,0000,0000,2p120 } [ -0x100,0000,0000,0018,0000,0000,0000,0001 >bignum -1 /f ] unit-test
263
264 { 17 } [ 17 >bignum 5 max ] unit-test
265 { 5 } [ 17 >bignum 5 min ] unit-test
266
267 { 1 } [ 1 202402253307310618352495346718917307049556649764142118356901358027430339567995346891960383701437124495187077864316811911389808737385793476867013399940738509921517424276566361364466907742093216341239767678472745068562007483424692698618103355649159556340810056512358769552333414615230502532186327508646006263307707741093494784 /f double>bits ] unit-test
268 { 12 } [ 3 50600563326827654588123836679729326762389162441035529589225339506857584891998836722990095925359281123796769466079202977847452184346448369216753349985184627480379356069141590341116726935523304085309941919618186267140501870856173174654525838912289889085202514128089692388083353653807625633046581877161501565826926935273373696 /f double>bits ] unit-test
269 { 123 } [ 123 202402253307310618352495346718917307049556649764142118356901358027430339567995346891960383701437124495187077864316811911389808737385793476867013399940738509921517424276566361364466907742093216341239767678472745068562007483424692698618103355649159556340810056512358769552333414615230502532186327508646006263307707741093494784 /f double>bits ] unit-test
270 { 1234 } [ 617 101201126653655309176247673359458653524778324882071059178450679013715169783997673445980191850718562247593538932158405955694904368692896738433506699970369254960758712138283180682233453871046608170619883839236372534281003741712346349309051677824579778170405028256179384776166707307615251266093163754323003131653853870546747392 /f double>bits ] unit-test
271 { 1/0. } [ 2048 2^ 1 /f ] unit-test
272 { -1/0. } [ 2048 2^ -1 /f ] unit-test
273 { -1/0. } [ 2048 2^ neg 1 /f ] unit-test
274 { 1/0. } [ 2048 2^ neg -1 /f ] unit-test