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