11module NumberTest
22
33include "number"
4+ from Number use { (+), (-), (*), (/) as div, (**) }
45include "result"
56include "int32"
67include "int64"
@@ -15,82 +16,70 @@ assert Number.tau == 6.283185307179586
1516assert Number.e == 2.718281828459045
1617// Operations Tests
1718// add
18- assert Number.add(25, 5) == 30
19- assert Number.add( Infinity, 10) == Infinity
20- assert Number.add( Infinity, Infinity) == Infinity
21- assert Number.isNaN(Number.add( Infinity, NaN) )
22- assert Number.isNaN(Number.add( NaN, NaN) )
19+ assert 25 + 5 == 30
20+ assert Infinity + 10 == Infinity
21+ assert Infinity + Infinity == Infinity
22+ assert Number.isNaN(Infinity + NaN)
23+ assert Number.isNaN(NaN + NaN)
2324// Rational addition tests
24- {
25- from Number use { add as (+) }
26- assert 2/3 + 4 == 14/3
27- assert 2/3 + Int32.toNumber(4l) == 14/3
28- assert 2/3 + Int64.toNumber(4L) == 14/3
29- assert 4 + 2/3 == 14/3
30- assert Int32.toNumber(4l) + 2/3 == 14/3
31- assert Int64.toNumber(4L) + 2/3 == 14/3
32- assert 2/3 + 4.0 == 4.666666666666667
33- }
25+ assert 2/3 + 4 == 14/3
26+ assert 2/3 + Int32.toNumber(4l) == 14/3
27+ assert 2/3 + Int64.toNumber(4L) == 14/3
28+ assert 4 + 2/3 == 14/3
29+ assert Int32.toNumber(4l) + 2/3 == 14/3
30+ assert Int64.toNumber(4L) + 2/3 == 14/3
31+ assert 2/3 + 4.0 == 4.666666666666667
3432// sub
35- assert Number.sub(25, 5) == 20
36- assert Number.sub( Infinity, 10) == Infinity
37- assert Number.isNaN(Number.sub( Infinity, Infinity) )
38- assert Number.isNaN(Number.sub( Infinity, NaN) )
39- assert Number.isNaN(Number.sub( NaN, NaN) )
33+ assert 25 - 5 == 20
34+ assert Infinity - 10 == Infinity
35+ assert Number.isNaN(Infinity - Infinity)
36+ assert Number.isNaN(Infinity - NaN)
37+ assert Number.isNaN(NaN - NaN)
4038// Rational subtraction tests
41- {
42- from Number use { sub as (-) }
43- assert 2/3 - 4 == -10/3
44- assert 2/3 - Int32.toNumber(4l) == -10/3
45- assert 2/3 - Int64.toNumber(4L) == -10/3
46- assert 4 - 2/3 == 10/3
47- assert Int32.toNumber(4l) - 2/3 == 10/3
48- assert Int64.toNumber(4L) - 2/3 == 10/3
49- assert 2/3 - 4.0 == -3.3333333333333335
50- assert 4.0 - 2/3 == 3.3333333333333335
51- }
39+ assert 2/3 - 4 == -10/3
40+ assert 2/3 - Int32.toNumber(4l) == -10/3
41+ assert 2/3 - Int64.toNumber(4L) == -10/3
42+ assert 4 - 2/3 == 10/3
43+ assert Int32.toNumber(4l) - 2/3 == 10/3
44+ assert Int64.toNumber(4L) - 2/3 == 10/3
45+ assert 2/3 - 4.0 == -3.3333333333333335
46+ assert 4.0 - 2/3 == 3.3333333333333335
5247// mul
53- assert Number.mul(5, 5) == 25
54- assert Number.mul( 9223372036854775809, 5) == 46116860184273879045
55- assert Number.mul( 9223372036854775809, 9223372036854775809) ==
48+ assert 5 * 5 == 25
49+ assert 9223372036854775809 * 5 == 46116860184273879045
50+ assert 9223372036854775809 * 9223372036854775809 ==
5651 85070591730234615884290395931651604481
57- assert Number.mul( Infinity, 10) == Infinity
58- assert Number.mul( Infinity, Infinity) == Infinity
59- assert Number.isNaN(Number.mul( Infinity, NaN) )
60- assert Number.isNaN(Number.mul( NaN, NaN) )
52+ assert Infinity * 10 == Infinity
53+ assert Infinity * Infinity == Infinity
54+ assert Number.isNaN(Infinity * NaN)
55+ assert Number.isNaN(NaN * NaN)
6156// Rational mul tests
62- {
63- from Number use { mul as (*) }
64- assert 2/3 * 4 == 8/3
65- assert 2/3 * Int32.toNumber(4l) == 8/3
66- assert 2/3 * Int64.toNumber(4L) == 8/3
67- assert 4 * (2/3) == 8/3
68- assert Int32.toNumber(4l) * (2/3) == 8/3
69- assert Int64.toNumber(4L) * (2/3) == 8/3
70- assert 2/3 * 4.0 < 2.666666666666667
71- assert 2.6666666666666 < 2/3 * 4.0
72- }
57+ assert 2/3 * 4 == 8/3
58+ assert 2/3 * Int32.toNumber(4l) == 8/3
59+ assert 2/3 * Int64.toNumber(4L) == 8/3
60+ assert 4 * (2/3) == 8/3
61+ assert Int32.toNumber(4l) * (2/3) == 8/3
62+ assert Int64.toNumber(4L) * (2/3) == 8/3
63+ assert 2/3 * 4.0 < 2.666666666666667
64+ assert 2.6666666666666 < 2/3 * 4.0
7365// div
74- assert Number. div(25, 5) == 5
75- assert Number. div(9223372036854775809, 9) == 1024819115206086201
76- assert Number. div(9223372036854775809, 9223372036854775809) == 1
77- assert Number. div(9223372036854775808, 27670116110564327424) == 1/3
78- assert Number. div(Infinity, 10) == Infinity
79- assert Number.isNaN(Number. div(Infinity, Infinity))
80- assert Number.isNaN(Number. div(Infinity, NaN))
81- assert Number.isNaN(Number. div(NaN, NaN))
66+ assert div(25, 5) == 5
67+ assert div(9223372036854775809, 9) == 1024819115206086201
68+ assert div(9223372036854775809, 9223372036854775809) == 1
69+ assert div(9223372036854775808, 27670116110564327424) == 1/3
70+ assert div(Infinity, 10) == Infinity
71+ assert Number.isNaN(div(Infinity, Infinity))
72+ assert Number.isNaN(div(Infinity, NaN))
73+ assert Number.isNaN(div(NaN, NaN))
8274// Rational div tests
83- {
84- from Number use { div as (/) }
85- assert 2/3 / 4 == 1/6
86- assert 2/3 / Int32.toNumber(4l) == 1/6
87- assert 2/3 / Int64.toNumber(4L) == 1/6
88- assert 4 / (2/3) == 6
89- assert Int32.toNumber(4l) / (2/3) == 6
90- assert Int64.toNumber(4L) / (2/3) == 6
91- assert 2/3 / 4.0 == 0.16666666666666666
92- assert 4.0 / (2/3) == 6.0
93- }
75+ assert div(2/3, 4) == 1/6
76+ assert div(2/3, Int32.toNumber(4l)) == 1/6
77+ assert div(2/3, Int64.toNumber(4L)) == 1/6
78+ assert div(4, 2/3) == 6
79+ assert div(Int32.toNumber(4l), 2/3) == 6
80+ assert div(Int64.toNumber(4L), 2/3) == 6
81+ assert div(2/3, 4.0) == 0.16666666666666666
82+ assert div(4.0, 2/3) == 6.0
9483// Number.pow tests are based on test cases from libc-test: http://nsz.repo.hu/git/?p=libc-test
9584/*
9685 libc-test is licensed under the following standard MIT license:
@@ -117,111 +106,109 @@ assert Number.isNaN(Number.div(NaN, NaN))
117106 and src/math/crlibm/* for details
118107*/
119108// pow
120- assert Number.isNaN(Number.pow(-8.06684839057968084, 4.53566256067686879))
121- assert Number.pow(4.34523984933830487, -8.88799136300345083) ==
122- 0.00000213471188255872853
123- assert Number.isNaN(Number.pow(-8.38143342755524934, -2.76360733737958819))
124- assert Number.isNaN(Number.pow(-6.53167358191348413, 4.56753527684274374))
125- assert Number.pow(9.26705696697258574, 4.81139208435979615) ==
126- 44909.2994151296589
127- assert Number.isNaN(Number.pow(-6.45004555606023633, 0.662071792337673881))
128- assert Number.pow(7.85889025304169664, 0.0521545267500622481) ==
129- 1.11351774134586523
130- assert Number.isNaN(Number.pow(-0.792054511984895959, 7.67640268511753998))
131- assert Number.pow(0.615702673197924044, 2.01190257903248026) ==
132- 0.376907735213801831
133- assert Number.isNaN(Number.pow(-0.558758682360915193, 0.0322398306026380407))
134- assert Number.isNaN(Number.pow(0.0, NaN))
135- assert Number.pow(0.0, Infinity) == 0.0
136- assert Number.pow(0.0, 3.0) == 0.0
137- assert Number.pow(0.0, 2.0) == 0.0
138- assert Number.pow(0.0, 1.0) == 0.0
139- assert Number.pow(0.0, 0.5) == 0.0
140- assert Number.isNaN(Number.pow(0.0, 0.0))
141- assert Number.isNaN(Number.pow(0.0, -0.0))
142- assert Number.pow(0.0, -0.5) == Infinity
143- assert Number.pow(0.0, -1.0) == Infinity
144- assert Number.pow(0.0, -2.0) == Infinity
145- assert Number.pow(0.0, -3.0) == Infinity
146- assert Number.pow(0.0, -4.0) == Infinity
147- assert Number.pow(0.0, -Infinity) == Infinity
148- assert Number.isNaN(Number.pow(-0.0, NaN))
149- assert Number.pow(-0.0, Infinity) == 0.0
150- assert Number.pow(-0.0, 3.0) == -0.0
151- assert Number.pow(-0.0, 2.0) == 0.0
152- assert Number.pow(-0.0, 1.0) == -0.0
153- assert Number.pow(-0.0, 0.5) == 0.0
154- assert Number.isNaN(Number.pow(-0.0, 0.0))
155- assert Number.isNaN(Number.pow(-0.0, -0.0))
156- assert Number.pow(-0.0, -0.5) == Infinity
157- assert Number.pow(-0.0, -1.0) == -Infinity
158- assert Number.pow(-0.0, -2.0) == Infinity
159- assert Number.pow(-0.0, -3.0) == -Infinity
160- assert Number.pow(-0.0, -4.0) == Infinity
161- assert Number.pow(-0.0, -Infinity) == Infinity
162- assert Number.isNaN(Number.pow(NaN, 0.0))
163- assert Number.isNaN(Number.pow(Infinity, 0.0))
164- assert Number.isNaN(Number.pow(-Infinity, 0.0))
165- assert Number.isNaN(Number.pow(1.0, 0.0))
166- assert Number.isNaN(Number.pow(-1.0, 0.0))
167- assert Number.isNaN(Number.pow(-0.5, 0.0))
168- assert Number.isNaN(Number.pow(NaN, -0.0))
169- assert Number.pow(1, 1) == 1
170- assert Number.pow(2, 1) == 2
171- assert Number.pow(300, 1) == 300
172- assert Number.pow(-1, 1) == -1
173- assert Number.pow(-2, 1) == -2
174- assert Number.pow(-300, 1) == -300
175- assert Number.pow(0, 1) == 0
176- assert Number.pow(1, 0) == 1
177- assert Number.pow(0, 0) == 1
178- assert Number.pow(1, 5) == 1
179- assert Number.pow(5, 5) == 3125
180- assert Number.pow(-5, 5) == -3125
181- assert Number.pow(5, 6) == 15625
182- assert Number.pow(-5, 6) == 15625
183- assert Number.pow(1.0, 1) == 1.0
184- assert Number.pow(2, 1.0) == 2.0
185- assert Number.pow(300.0, 1) == 300.0
186- assert Number.pow(-1, 1.0) == -1.0
187- assert Number.pow(-2.0, 1) == -2.0
188- assert Number.pow(-300, 1.0) == -300.0
189- assert Number.pow(0.0, 1) == 0.0
190- assert Number.isNaN(Number.pow(1, 0.0))
191- assert Number.isNaN(Number.pow(0.0, 0))
192- assert Number.pow(1, 5.0) == 1.0
193- assert Number.pow(5.0, 5) == 3125.0
194- assert Number.pow(-1.0, 1) == -1.0
195- assert Number.pow(-4.0, 3) == -64.0
196- assert Number.pow(-4, 3.0) == -64.0
197- assert Number.pow(-5, 5.0) == -3125.0
198- assert Number.pow(5.0, 6) == 15625.0
199- assert Number.pow(-5, 6.0) == 15625.0
200- assert Number.pow(1/2, 1) == 1/2
201- assert Number.pow(1/2, 2) == 1/4
202- assert Number.pow(2, 1/2) == 1.4142135623730952
203- assert Number.pow(4, 1/2) == 2
204- assert Number.pow(4, -1/2) == 0.5
205- assert Number.pow(9223372036854775809, 2) ==
206- 85070591730234615884290395931651604481
207- assert Number.pow(9223372036854775809, 0.5) == 3037000499.97605
208- assert Number.pow(9223372036854775809.0, 0.5) == 3037000499.97605
209- assert Number.pow(9223372036854775809, 0) == 1
109+ assert Number.isNaN(-8.06684839057968084 ** 4.53566256067686879)
110+ assert 4.34523984933830487 ** -8.88799136300345083 == 0.00000213471188255872853
111+ assert Number.isNaN(-8.38143342755524934 ** -2.76360733737958819)
112+ assert Number.isNaN(-6.53167358191348413 ** 4.56753527684274374)
113+ assert 9.26705696697258574 ** 4.81139208435979615 == 44909.2994151296589
114+ assert Number.isNaN(-6.45004555606023633 ** 0.662071792337673881)
115+ assert 7.85889025304169664 ** 0.0521545267500622481 == 1.11351774134586523
116+ assert Number.isNaN(-0.792054511984895959 ** 7.67640268511753998)
117+ assert 0.615702673197924044 ** 2.01190257903248026 == 0.376907735213801831
118+ assert Number.isNaN(-0.558758682360915193 ** 0.0322398306026380407)
119+ assert Number.isNaN(0.0 ** NaN)
120+ assert 0.0 ** Infinity == 0.0
121+ assert 0.0 ** 3.0 == 0.0
122+ assert 0.0 ** 2.0 == 0.0
123+ assert 0.0 ** 1.0 == 0.0
124+ assert 0.0 ** 0.5 == 0.0
125+ assert Number.isNaN(0.0 ** 0.0)
126+ assert Number.isNaN(0.0 ** -0.0)
127+ assert 0.0 ** -0.5 == Infinity
128+ assert 0.0 ** -1.0 == Infinity
129+ assert 0.0 ** -2.0 == Infinity
130+ assert 0.0 ** -3.0 == Infinity
131+ assert 0.0 ** -4.0 == Infinity
132+ assert 0.0 ** -Infinity == Infinity
133+ assert Number.isNaN(-0.0 ** NaN)
134+ assert -0.0 ** Infinity == 0.0
135+ assert -0.0 ** 3.0 == -0.0
136+ assert -0.0 ** 2.0 == 0.0
137+ assert -0.0 ** 1.0 == -0.0
138+ assert -0.0 ** 0.5 == 0.0
139+ assert Number.isNaN(-0.0 ** 0.0)
140+ assert Number.isNaN(-0.0 ** -0.0)
141+ assert -0.0 ** -0.5 == Infinity
142+ assert -0.0 ** -1.0 == -Infinity
143+ assert -0.0 ** -2.0 == Infinity
144+ assert -0.0 ** -3.0 == -Infinity
145+ assert -0.0 ** -4.0 == Infinity
146+ assert -0.0 ** -Infinity == Infinity
147+ assert Number.isNaN(NaN ** 0.0)
148+ assert Number.isNaN(Infinity ** 0.0)
149+ assert Number.isNaN(-Infinity ** 0.0)
150+ assert Number.isNaN(1.0 ** 0.0)
151+ assert Number.isNaN(-1.0 ** 0.0)
152+ assert Number.isNaN(-0.5 ** 0.0)
153+ assert Number.isNaN(NaN ** -0.0)
154+ assert 1 ** 1 == 1
155+ assert 2 ** 1 == 2
156+ assert 300 ** 1 == 300
157+ assert -1 ** 1 == -1
158+ assert -2 ** 1 == -2
159+ assert -300 ** 1 == -300
160+ assert 0 ** 1 == 0
161+ assert 1 ** 0 == 1
162+ assert 0 ** 0 == 1
163+ assert 1 ** 5 == 1
164+ assert 5 ** 5 == 3125
165+ assert -5 ** 5 == -3125
166+ assert 5 ** 6 == 15625
167+ assert -5 ** 6 == 15625
168+ assert 1.0 ** 1 == 1.0
169+ assert 2 ** 1.0 == 2.0
170+ assert 300.0 ** 1 == 300.0
171+ assert -1 ** 1.0 == -1.0
172+ assert -2.0 ** 1 == -2.0
173+ assert -300 ** 1.0 == -300.0
174+ assert 0.0 ** 1 == 0.0
175+ assert Number.isNaN(1 ** 0.0)
176+ assert Number.isNaN(0.0 ** 0)
177+ assert 1 ** 5.0 == 1.0
178+ assert 5.0 ** 5 == 3125.0
179+ assert -1.0 ** 1 == -1.0
180+ assert -4.0 ** 3 == -64.0
181+ assert -4 ** 3.0 == -64.0
182+ assert -5 ** 5.0 == -3125.0
183+ assert 5.0 ** 6 == 15625.0
184+ assert -5 ** 6.0 == 15625.0
185+
186+ // Workaround for formatter bug for rational literals
187+ let pow = (**)
188+
189+ assert pow(1/2, 1) == 1/2
190+ assert pow(1/2, 2) == 1/4
191+ assert pow(2, 1 / 2) == 1.4142135623730952
192+ assert pow(4, 1 / 2) == 2
193+ assert pow(4, -1 / 2) == 0.5
194+ assert 9223372036854775809 ** 2 == 85070591730234615884290395931651604481
195+ assert 9223372036854775809 ** 0.5 == 3037000499.97605
196+ assert 9223372036854775809.0 ** 0.5 == 3037000499.97605
197+ assert 9223372036854775809 ** 0 == 1
210198// TODO(#1168): Use rational literal
211199let denom = 85070591730234615884290395931651604481
212- assert Number.pow(9223372036854775809, -2) ==
213- 1 / denom // 1.1754943508222875e-38
214- assert Number.pow(9223372036854775809, 1/5) == 6208.375056426594
215- assert Number.pow(9223372036854775809, 2/3) == 4398046511103.9927
216- assert Number.pow(10223372036854775809, 10) ==
200+ assert 9223372036854775809 ** -2 == 1 / denom // 1.1754943508222875e-38
201+ assert pow(9223372036854775809, 1 / 5) == 6208.375056426594
202+ assert pow(9223372036854775809, 2 / 3) == 4398046511103.9927
203+ assert 10223372036854775809 ** 10 ==
217204 12472159440978016923768615307032788210916694000775261660538874886865415760948494778813645195039710006678013364969179502650466497057008288260604039903029954443675868581729857084924132550246401
218- assert Number.pow(1, 9223372036854775809) == 1
219- assert Number.pow( 2.0, 9223372036854775809) == Infinity
220- assert Number. pow(1/2, 2) == 1/4
221- assert Number. pow(1/2, 3) == 1/8
222- assert Number.isRational(Number. pow(1/2, 2))
223- assert Number.isRational(Number. pow(1/2, 3))
224- assert Number. pow(1/2, -2) == 4
205+ assert 1 ** 9223372036854775809 == 1
206+ assert 2.0 ** 9223372036854775809 == Infinity
207+ assert pow(1/2, 2) == 1/4
208+ assert pow(1/2, 3) == 1/8
209+ assert Number.isRational(pow(1/2, 2))
210+ assert Number.isRational(pow(1/2, 3))
211+ assert pow(1/2, -2) == 4
225212// exp
226213assert Number.exp(1) == 2.718281828459045
227214assert Number.exp(10) == 22026.465794806703
0 commit comments