]> gitweb.factorcode.org Git - factor.git/blob - core/math/integers/integers-tests.factor
Merge branch 'master' into new_gc
[factor.git] / core / math / integers / integers-tests.factor
1 USING: kernel math math.functions namespaces prettyprint
2 math.private continuations tools.test sequences random ;
3 IN: math.integers.tests
4
5 [ "-8" ] [ -8 unparse ] unit-test
6
7 [ t ] [ 0 fixnum? ] unit-test
8 [ t ] [ 31415 number? ] unit-test
9 [ t ] [ 31415 >bignum number? ] unit-test
10 [ t ] [ 2345621 fixnum? ] unit-test
11
12 [ t ] [ 2345621 dup >bignum >fixnum = ] unit-test
13
14 [ t ] [ 0 >fixnum 0 >bignum = ] unit-test
15 [ f ] [ 0 >fixnum 1 >bignum = ] unit-test
16 [ f ] [ 1 >bignum 0 >bignum = ] unit-test
17 [ t ] [ 0 >bignum 0 >fixnum = ] unit-test
18
19 [ t ] [ 0 >bignum bignum? ] unit-test
20 [ f ] [ 0 >fixnum bignum? ] unit-test
21 [ f ] [ 0 >fixnum bignum? ] unit-test
22 [ t ] [ 0 >fixnum fixnum? ] unit-test
23
24 [ -1 ] [ 1 neg ] unit-test
25 [ -1 ] [ 1 >bignum neg ] unit-test
26 [ 268435456 ] [ -268435456 >fixnum -1 * ] unit-test
27 [ 268435456 ] [ -268435456 >fixnum neg ] unit-test
28
29 [ 9 3 ] [ 93 10 /mod ] unit-test
30 [ 9 3 ] [ 93 >bignum 10 /mod ] unit-test
31
32 [ 5 ] [ 2 >bignum 3 >bignum + ] unit-test
33
34 [ -10000000001981284352 ] [
35     -10000000000000000000
36     HEX: -100000000 bitand
37 ] unit-test
38
39 [ 9999999997686317056 ] [
40     10000000000000000000
41     HEX: -100000000 bitand
42 ] unit-test
43
44 [ 4294967296 ] [
45     -10000000000000000000
46     HEX: 100000000 bitand
47 ] unit-test
48
49 [ 0 ] [
50     10000000000000000000
51     HEX: 100000000 bitand
52 ] unit-test
53
54 [ -1 ] [ -1 >bignum >fixnum ] unit-test
55
56 [ "8589934592" ]
57 [ 134217728 dup + dup + dup + dup + dup + dup + unparse ]
58 unit-test
59
60 [ 7 ] [ 255 log2 ] unit-test
61 [ 8 ] [ 256 log2 ] unit-test
62 [ 8 ] [ 257 log2 ] unit-test
63 [ 0 ] [ 1   log2 ] unit-test
64
65 [ 7 ] [ 255 >bignum log2 ] unit-test
66 [ 8 ] [ 256 >bignum log2 ] unit-test
67 [ 8 ] [ 257 >bignum log2 ] unit-test
68 [ 0 ] [ 1   >bignum log2 ] unit-test
69
70 [ t ] [ BIN: 1101 0 bit? ] unit-test
71 [ f ] [ BIN: 1101 1 bit? ] unit-test
72 [ t ] [ BIN: 1101 2 bit? ] unit-test
73 [ t ] [ BIN: 1101 3 bit? ] unit-test
74 [ f ] [ BIN: 1101 4 bit? ] unit-test
75
76 [ t ] [ BIN: 1101 >bignum 0 bit? ] unit-test
77 [ f ] [ BIN: 1101 >bignum 1 bit? ] unit-test
78 [ t ] [ BIN: 1101 >bignum 2 bit? ] unit-test
79 [ t ] [ BIN: 1101 >bignum 3 bit? ] unit-test
80 [ f ] [ BIN: 1101 >bignum 4 bit? ] unit-test
81
82 [ t ] [ BIN: -1101 0 bit? ] unit-test
83 [ t ] [ BIN: -1101 1 bit? ] unit-test
84 [ f ] [ BIN: -1101 2 bit? ] unit-test
85 [ f ] [ BIN: -1101 3 bit? ] unit-test
86 [ t ] [ BIN: -1101 4 bit? ] unit-test
87
88 [ t ] [ BIN: -1101 >bignum 0 bit? ] unit-test
89 [ t ] [ BIN: -1101 >bignum 1 bit? ] unit-test
90 [ f ] [ BIN: -1101 >bignum 2 bit? ] unit-test
91 [ f ] [ BIN: -1101 >bignum 3 bit? ] unit-test
92 [ t ] [ BIN: -1101 >bignum 4 bit? ] unit-test
93
94 [ t ] [ 1067811677921310779 >bignum 59 bit? ] unit-test
95
96 [ 2 ] [ 0 next-power-of-2 ] unit-test
97 [ 2 ] [ 1 next-power-of-2 ] unit-test
98 [ 2 ] [ 2 next-power-of-2 ] unit-test
99 [ 4 ] [ 3 next-power-of-2 ] unit-test
100 [ 16 ] [ 13 next-power-of-2 ] unit-test
101 [ 16 ] [ 16 next-power-of-2 ] unit-test
102
103 [ 268435456 ] [ -268435456 >fixnum -1 /i ] unit-test
104 [ 268435456 0 ] [ -268435456 >fixnum -1 /mod ] unit-test
105 [ 0 ] [ -1 -268435456 >fixnum /i ] unit-test
106 [ 4420880996869850977 ] [ 13262642990609552931 3 /i ] unit-test
107 [ 0 -1 ] [ -1 -268435456 >fixnum /mod ] unit-test
108 [ 0 -1 ] [ -1 -268435456 >bignum /mod ] unit-test
109 [ 14355 ] [ 1591517158873146351817850880000000 32769 mod ] unit-test
110 [ 8 530505719624382123 ] [ 13262642990609552931 1591517158873146351 /mod ] unit-test
111 [ 8 ] [ 13262642990609552931 1591517158873146351 /i ] unit-test
112 [ 530505719624382123 ] [ 13262642990609552931 1591517158873146351 mod ] unit-test
113
114 [ -351382792 ] [ -43922849 3 shift ] unit-test
115
116 [ t ] [ 0 zero? ] unit-test
117 [ f ] [ 30 zero? ] unit-test
118 [ t ] [ 0 >bignum zero? ] unit-test
119
120 [ 4294967280 ] [ 268435455 >fixnum 16 fixnum* ] unit-test
121
122 [ 23603949310011464311086123800853779733506160743636399259558684142844552151041 ]
123 [
124     1957739506503920732625800353008742584087090810400921800808997218266517557963281171906190947801528098188887586755474449585677502695226712388326288208691204
125     79562815144503850065234921197651376510595262628033069372760833939060637564931
126     bignum-mod
127 ] unit-test
128
129 ! We don't care if this fails or returns 0 (its CPU-specific)
130 ! as long as it doesn't crash
131 [ ] [ [ 0 0 /i drop ] ignore-errors ] unit-test
132 [ ] [ [ 100000000000000000 0 /i drop ] ignore-errors ] unit-test
133
134 [ -2 ] [ 1 bitnot ] unit-test
135 [ -2 ] [ 1 >bignum bitnot ] unit-test
136 [ -2 ] [ 1 >bignum bitnot ] unit-test
137 [ 0 ] [ 123 dup bitnot bitand ] unit-test
138 [ 0 ] [ 123 >bignum dup bitnot bitand ] unit-test
139 [ 0 ] [ 123 dup bitnot >bignum bitand ] unit-test
140 [ 0 ] [ 123 dup bitnot bitand >bignum ] unit-test
141 [ -1 ] [ 123 dup bitnot bitor ] unit-test
142 [ -1 ] [ 123 >bignum dup bitnot bitor ] unit-test
143 [ -1 ] [ 123 dup bitnot >bignum bitor ] unit-test
144 [ -1 ] [ 123 dup bitnot bitor >bignum ] unit-test
145 [ -1 ] [ 123 dup bitnot bitxor ] unit-test
146 [ -1 ] [ 123 >bignum dup bitnot bitxor ] unit-test
147 [ -1 ] [ 123 dup bitnot >bignum bitxor ] unit-test
148 [ -1 ] [ 123 dup bitnot bitxor >bignum ] unit-test
149 [ 4 ] [ 4 7 bitand ] unit-test
150
151 [ 256 ] [ 65536 -8 shift ] unit-test
152 [ 256 ] [ 65536 >bignum -8 shift ] unit-test
153 [ 256 ] [ 65536 -8 >bignum shift ] unit-test
154 [ 256 ] [ 65536 >bignum -8 >bignum shift ] unit-test
155 [ 4294967296 ] [ 1 16 shift 16 shift ] unit-test
156 [ 4294967296 ] [ 1 32 shift ] unit-test
157 [ 1267650600228229401496703205376 ] [ 1 100 shift ] unit-test
158
159 [ t ] [ 1 27 shift fixnum? ] unit-test
160
161 [ t ] [
162     t
163     [ 27 28 29 30 31 32 59 60 61 62 63 64 ]
164     [
165         1 over shift swap 1 >bignum swap shift = and
166     ] each
167 ] unit-test
168
169 [ t ] [
170     t
171     [ 27 28 29 30 31 32 59 60 61 62 63 64 ]
172     [
173         -1 over shift swap -1 >bignum swap shift = and
174     ] each
175 ] unit-test
176
177 [ 12 ] [ 11 4 align ] unit-test
178 [ 12 ] [ 12 4 align ] unit-test
179 [ 10 ] [ 10 2 align ] unit-test
180 [ 14 ] [ 13 2 align ] unit-test
181 [ 11 ] [ 11 1 align ] unit-test
182
183 [ HEX: 332211 ] [
184     B{ HEX: 11 HEX: 22 HEX: 33 } byte-array>bignum
185 ] unit-test
186
187 [ HEX: 7a2c793b2ff08554 ] [
188     B{ HEX: 54 HEX: 85 HEX: f0 HEX: 2f HEX: 3b HEX: 79 HEX: 2c HEX: 7a } byte-array>bignum
189 ] unit-test
190
191 [ HEX: 988a259c3433f237 ] [
192     B{ HEX: 37 HEX: f2 HEX: 33 HEX: 34 HEX: 9c HEX: 25 HEX: 8a HEX: 98 } byte-array>bignum
193 ] unit-test
194
195 [ t ] [ 256 power-of-2? ] unit-test
196 [ f ] [ 123 power-of-2? ] unit-test
197
198 [ f ] [ -128 power-of-2? ] unit-test
199 [ f ] [ 0 power-of-2? ] unit-test
200 [ t ] [ 1 power-of-2? ] unit-test
201
202 : ratio>float ( a b -- f ) [ >bignum ] bi@ /f ;
203
204 [ 5. ] [ 5 1 ratio>float ] unit-test
205 [ 4. ] [ 4 1 ratio>float ] unit-test
206 [ 2. ] [ 2 1 ratio>float ] unit-test
207 [ .5 ] [ 1 2 ratio>float ] unit-test
208 [ .75 ] [ 3 4 ratio>float ] unit-test
209 [ 1. ] [ 2000 2^ 2000 2^ 1 + ratio>float ] unit-test
210 [ -1. ] [ 2000 2^ neg 2000 2^ 1 + ratio>float ] unit-test
211 [ 0.4 ] [ 6 15 ratio>float ] unit-test
212
213 [ HEX: 3fe553522d230931 ]
214 [ 61967020039 92984792073 ratio>float double>bits ] unit-test
215
216 : random-integer ( -- n )
217     32 random-bits
218     1 random zero? [ neg ] when
219     1 random zero? [ >bignum ] when ;
220
221 [ t ] [
222     1000 [
223         drop
224         random-integer
225         random-integer
226         [ >float / ] [ /f ] 2bi 0.1 ~
227     ] all?
228 ] unit-test
229
230 ! Ensure that /f is accurate for fixnums > 2^53 on 64-bit platforms
231 [ HEX: 1.758bec11492f9p-54 ] [ 1 12345678901234567 /f ] unit-test
232 [ HEX: -1.758bec11492f9p-54 ] [ 1 -12345678901234567 /f ] unit-test