Skip to content

Commit cbd46ee

Browse files
authored
chore(stdlib)!: Replace bigint/number arithmetic functions with operators (#1742)
1 parent decb053 commit cbd46ee

File tree

6 files changed

+1129
-999
lines changed

6 files changed

+1129
-999
lines changed

compiler/test/stdlib/bigint.test.gr

Lines changed: 655 additions & 672 deletions
Large diffs are not rendered by default.

compiler/test/stdlib/number.test.gr

Lines changed: 157 additions & 170 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module NumberTest
22

33
include "number"
4+
from Number use { (+), (-), (*), (/) as div, (**) }
45
include "result"
56
include "int32"
67
include "int64"
@@ -15,82 +16,70 @@ assert Number.tau == 6.283185307179586
1516
assert 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
211199
let 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
226213
assert Number.exp(1) == 2.718281828459045
227214
assert Number.exp(10) == 22026.465794806703

0 commit comments

Comments
 (0)