Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(stdlib)!: Replace bigint/number arithmetic functions with operators #1742

Merged
merged 1 commit into from
Mar 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,327 changes: 655 additions & 672 deletions compiler/test/stdlib/bigint.test.gr

Large diffs are not rendered by default.

327 changes: 157 additions & 170 deletions compiler/test/stdlib/number.test.gr
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
module NumberTest

include "number"
from Number use { (+), (-), (*), (/) as div, (**) }
include "result"
include "int32"
include "int64"
Expand All @@ -15,82 +16,70 @@ assert Number.tau == 6.283185307179586
assert Number.e == 2.718281828459045
// Operations Tests
// add
assert Number.add(25, 5) == 30
assert Number.add(Infinity, 10) == Infinity
assert Number.add(Infinity, Infinity) == Infinity
assert Number.isNaN(Number.add(Infinity, NaN))
assert Number.isNaN(Number.add(NaN, NaN))
assert 25 + 5 == 30
assert Infinity + 10 == Infinity
assert Infinity + Infinity == Infinity
assert Number.isNaN(Infinity + NaN)
assert Number.isNaN(NaN + NaN)
// Rational addition tests
{
from Number use { add as (+) }
assert 2/3 + 4 == 14/3
assert 2/3 + Int32.toNumber(4l) == 14/3
assert 2/3 + Int64.toNumber(4L) == 14/3
assert 4 + 2/3 == 14/3
assert Int32.toNumber(4l) + 2/3 == 14/3
assert Int64.toNumber(4L) + 2/3 == 14/3
assert 2/3 + 4.0 == 4.666666666666667
}
assert 2/3 + 4 == 14/3
assert 2/3 + Int32.toNumber(4l) == 14/3
assert 2/3 + Int64.toNumber(4L) == 14/3
assert 4 + 2/3 == 14/3
assert Int32.toNumber(4l) + 2/3 == 14/3
assert Int64.toNumber(4L) + 2/3 == 14/3
assert 2/3 + 4.0 == 4.666666666666667
// sub
assert Number.sub(25, 5) == 20
assert Number.sub(Infinity, 10) == Infinity
assert Number.isNaN(Number.sub(Infinity, Infinity))
assert Number.isNaN(Number.sub(Infinity, NaN))
assert Number.isNaN(Number.sub(NaN, NaN))
assert 25 - 5 == 20
assert Infinity - 10 == Infinity
assert Number.isNaN(Infinity - Infinity)
assert Number.isNaN(Infinity - NaN)
assert Number.isNaN(NaN - NaN)
// Rational subtraction tests
{
from Number use { sub as (-) }
assert 2/3 - 4 == -10/3
assert 2/3 - Int32.toNumber(4l) == -10/3
assert 2/3 - Int64.toNumber(4L) == -10/3
assert 4 - 2/3 == 10/3
assert Int32.toNumber(4l) - 2/3 == 10/3
assert Int64.toNumber(4L) - 2/3 == 10/3
assert 2/3 - 4.0 == -3.3333333333333335
assert 4.0 - 2/3 == 3.3333333333333335
}
assert 2/3 - 4 == -10/3
assert 2/3 - Int32.toNumber(4l) == -10/3
assert 2/3 - Int64.toNumber(4L) == -10/3
assert 4 - 2/3 == 10/3
assert Int32.toNumber(4l) - 2/3 == 10/3
assert Int64.toNumber(4L) - 2/3 == 10/3
assert 2/3 - 4.0 == -3.3333333333333335
assert 4.0 - 2/3 == 3.3333333333333335
// mul
assert Number.mul(5, 5) == 25
assert Number.mul(9223372036854775809, 5) == 46116860184273879045
assert Number.mul(9223372036854775809, 9223372036854775809) ==
assert 5 * 5 == 25
assert 9223372036854775809 * 5 == 46116860184273879045
assert 9223372036854775809 * 9223372036854775809 ==
85070591730234615884290395931651604481
assert Number.mul(Infinity, 10) == Infinity
assert Number.mul(Infinity, Infinity) == Infinity
assert Number.isNaN(Number.mul(Infinity, NaN))
assert Number.isNaN(Number.mul(NaN, NaN))
assert Infinity * 10 == Infinity
assert Infinity * Infinity == Infinity
assert Number.isNaN(Infinity * NaN)
assert Number.isNaN(NaN * NaN)
// Rational mul tests
{
from Number use { mul as (*) }
assert 2/3 * 4 == 8/3
assert 2/3 * Int32.toNumber(4l) == 8/3
assert 2/3 * Int64.toNumber(4L) == 8/3
assert 4 * (2/3) == 8/3
assert Int32.toNumber(4l) * (2/3) == 8/3
assert Int64.toNumber(4L) * (2/3) == 8/3
assert 2/3 * 4.0 < 2.666666666666667
assert 2.6666666666666 < 2/3 * 4.0
}
assert 2/3 * 4 == 8/3
assert 2/3 * Int32.toNumber(4l) == 8/3
assert 2/3 * Int64.toNumber(4L) == 8/3
assert 4 * (2/3) == 8/3
assert Int32.toNumber(4l) * (2/3) == 8/3
assert Int64.toNumber(4L) * (2/3) == 8/3
assert 2/3 * 4.0 < 2.666666666666667
assert 2.6666666666666 < 2/3 * 4.0
// div
assert Number.div(25, 5) == 5
assert Number.div(9223372036854775809, 9) == 1024819115206086201
assert Number.div(9223372036854775809, 9223372036854775809) == 1
assert Number.div(9223372036854775808, 27670116110564327424) == 1/3
assert Number.div(Infinity, 10) == Infinity
assert Number.isNaN(Number.div(Infinity, Infinity))
assert Number.isNaN(Number.div(Infinity, NaN))
assert Number.isNaN(Number.div(NaN, NaN))
assert div(25, 5) == 5
assert div(9223372036854775809, 9) == 1024819115206086201
assert div(9223372036854775809, 9223372036854775809) == 1
assert div(9223372036854775808, 27670116110564327424) == 1/3
assert div(Infinity, 10) == Infinity
assert Number.isNaN(div(Infinity, Infinity))
assert Number.isNaN(div(Infinity, NaN))
assert Number.isNaN(div(NaN, NaN))
// Rational div tests
{
from Number use { div as (/) }
assert 2/3 / 4 == 1/6
assert 2/3 / Int32.toNumber(4l) == 1/6
assert 2/3 / Int64.toNumber(4L) == 1/6
assert 4 / (2/3) == 6
assert Int32.toNumber(4l) / (2/3) == 6
assert Int64.toNumber(4L) / (2/3) == 6
assert 2/3 / 4.0 == 0.16666666666666666
assert 4.0 / (2/3) == 6.0
}
assert div(2/3, 4) == 1/6
assert div(2/3, Int32.toNumber(4l)) == 1/6
assert div(2/3, Int64.toNumber(4L)) == 1/6
assert div(4, 2/3) == 6
assert div(Int32.toNumber(4l), 2/3) == 6
assert div(Int64.toNumber(4L), 2/3) == 6
assert div(2/3, 4.0) == 0.16666666666666666
assert div(4.0, 2/3) == 6.0
// Number.pow tests are based on test cases from libc-test: http://nsz.repo.hu/git/?p=libc-test
/*
libc-test is licensed under the following standard MIT license:
Expand All @@ -117,111 +106,109 @@ assert Number.isNaN(Number.div(NaN, NaN))
and src/math/crlibm/* for details
*/
// pow
assert Number.isNaN(Number.pow(-8.06684839057968084, 4.53566256067686879))
assert Number.pow(4.34523984933830487, -8.88799136300345083) ==
0.00000213471188255872853
assert Number.isNaN(Number.pow(-8.38143342755524934, -2.76360733737958819))
assert Number.isNaN(Number.pow(-6.53167358191348413, 4.56753527684274374))
assert Number.pow(9.26705696697258574, 4.81139208435979615) ==
44909.2994151296589
assert Number.isNaN(Number.pow(-6.45004555606023633, 0.662071792337673881))
assert Number.pow(7.85889025304169664, 0.0521545267500622481) ==
1.11351774134586523
assert Number.isNaN(Number.pow(-0.792054511984895959, 7.67640268511753998))
assert Number.pow(0.615702673197924044, 2.01190257903248026) ==
0.376907735213801831
assert Number.isNaN(Number.pow(-0.558758682360915193, 0.0322398306026380407))
assert Number.isNaN(Number.pow(0.0, NaN))
assert Number.pow(0.0, Infinity) == 0.0
assert Number.pow(0.0, 3.0) == 0.0
assert Number.pow(0.0, 2.0) == 0.0
assert Number.pow(0.0, 1.0) == 0.0
assert Number.pow(0.0, 0.5) == 0.0
assert Number.isNaN(Number.pow(0.0, 0.0))
assert Number.isNaN(Number.pow(0.0, -0.0))
assert Number.pow(0.0, -0.5) == Infinity
assert Number.pow(0.0, -1.0) == Infinity
assert Number.pow(0.0, -2.0) == Infinity
assert Number.pow(0.0, -3.0) == Infinity
assert Number.pow(0.0, -4.0) == Infinity
assert Number.pow(0.0, -Infinity) == Infinity
assert Number.isNaN(Number.pow(-0.0, NaN))
assert Number.pow(-0.0, Infinity) == 0.0
assert Number.pow(-0.0, 3.0) == -0.0
assert Number.pow(-0.0, 2.0) == 0.0
assert Number.pow(-0.0, 1.0) == -0.0
assert Number.pow(-0.0, 0.5) == 0.0
assert Number.isNaN(Number.pow(-0.0, 0.0))
assert Number.isNaN(Number.pow(-0.0, -0.0))
assert Number.pow(-0.0, -0.5) == Infinity
assert Number.pow(-0.0, -1.0) == -Infinity
assert Number.pow(-0.0, -2.0) == Infinity
assert Number.pow(-0.0, -3.0) == -Infinity
assert Number.pow(-0.0, -4.0) == Infinity
assert Number.pow(-0.0, -Infinity) == Infinity
assert Number.isNaN(Number.pow(NaN, 0.0))
assert Number.isNaN(Number.pow(Infinity, 0.0))
assert Number.isNaN(Number.pow(-Infinity, 0.0))
assert Number.isNaN(Number.pow(1.0, 0.0))
assert Number.isNaN(Number.pow(-1.0, 0.0))
assert Number.isNaN(Number.pow(-0.5, 0.0))
assert Number.isNaN(Number.pow(NaN, -0.0))
assert Number.pow(1, 1) == 1
assert Number.pow(2, 1) == 2
assert Number.pow(300, 1) == 300
assert Number.pow(-1, 1) == -1
assert Number.pow(-2, 1) == -2
assert Number.pow(-300, 1) == -300
assert Number.pow(0, 1) == 0
assert Number.pow(1, 0) == 1
assert Number.pow(0, 0) == 1
assert Number.pow(1, 5) == 1
assert Number.pow(5, 5) == 3125
assert Number.pow(-5, 5) == -3125
assert Number.pow(5, 6) == 15625
assert Number.pow(-5, 6) == 15625
assert Number.pow(1.0, 1) == 1.0
assert Number.pow(2, 1.0) == 2.0
assert Number.pow(300.0, 1) == 300.0
assert Number.pow(-1, 1.0) == -1.0
assert Number.pow(-2.0, 1) == -2.0
assert Number.pow(-300, 1.0) == -300.0
assert Number.pow(0.0, 1) == 0.0
assert Number.isNaN(Number.pow(1, 0.0))
assert Number.isNaN(Number.pow(0.0, 0))
assert Number.pow(1, 5.0) == 1.0
assert Number.pow(5.0, 5) == 3125.0
assert Number.pow(-1.0, 1) == -1.0
assert Number.pow(-4.0, 3) == -64.0
assert Number.pow(-4, 3.0) == -64.0
assert Number.pow(-5, 5.0) == -3125.0
assert Number.pow(5.0, 6) == 15625.0
assert Number.pow(-5, 6.0) == 15625.0
assert Number.pow(1/2, 1) == 1/2
assert Number.pow(1/2, 2) == 1/4
assert Number.pow(2, 1/2) == 1.4142135623730952
assert Number.pow(4, 1/2) == 2
assert Number.pow(4, -1/2) == 0.5
assert Number.pow(9223372036854775809, 2) ==
85070591730234615884290395931651604481
assert Number.pow(9223372036854775809, 0.5) == 3037000499.97605
assert Number.pow(9223372036854775809.0, 0.5) == 3037000499.97605
assert Number.pow(9223372036854775809, 0) == 1
assert Number.isNaN(-8.06684839057968084 ** 4.53566256067686879)
assert 4.34523984933830487 ** -8.88799136300345083 == 0.00000213471188255872853
assert Number.isNaN(-8.38143342755524934 ** -2.76360733737958819)
assert Number.isNaN(-6.53167358191348413 ** 4.56753527684274374)
assert 9.26705696697258574 ** 4.81139208435979615 == 44909.2994151296589
assert Number.isNaN(-6.45004555606023633 ** 0.662071792337673881)
assert 7.85889025304169664 ** 0.0521545267500622481 == 1.11351774134586523
assert Number.isNaN(-0.792054511984895959 ** 7.67640268511753998)
assert 0.615702673197924044 ** 2.01190257903248026 == 0.376907735213801831
assert Number.isNaN(-0.558758682360915193 ** 0.0322398306026380407)
assert Number.isNaN(0.0 ** NaN)
assert 0.0 ** Infinity == 0.0
assert 0.0 ** 3.0 == 0.0
assert 0.0 ** 2.0 == 0.0
assert 0.0 ** 1.0 == 0.0
assert 0.0 ** 0.5 == 0.0
assert Number.isNaN(0.0 ** 0.0)
assert Number.isNaN(0.0 ** -0.0)
assert 0.0 ** -0.5 == Infinity
assert 0.0 ** -1.0 == Infinity
assert 0.0 ** -2.0 == Infinity
assert 0.0 ** -3.0 == Infinity
assert 0.0 ** -4.0 == Infinity
assert 0.0 ** -Infinity == Infinity
assert Number.isNaN(-0.0 ** NaN)
assert -0.0 ** Infinity == 0.0
assert -0.0 ** 3.0 == -0.0
assert -0.0 ** 2.0 == 0.0
assert -0.0 ** 1.0 == -0.0
assert -0.0 ** 0.5 == 0.0
assert Number.isNaN(-0.0 ** 0.0)
assert Number.isNaN(-0.0 ** -0.0)
assert -0.0 ** -0.5 == Infinity
assert -0.0 ** -1.0 == -Infinity
assert -0.0 ** -2.0 == Infinity
assert -0.0 ** -3.0 == -Infinity
assert -0.0 ** -4.0 == Infinity
assert -0.0 ** -Infinity == Infinity
assert Number.isNaN(NaN ** 0.0)
assert Number.isNaN(Infinity ** 0.0)
assert Number.isNaN(-Infinity ** 0.0)
assert Number.isNaN(1.0 ** 0.0)
assert Number.isNaN(-1.0 ** 0.0)
assert Number.isNaN(-0.5 ** 0.0)
assert Number.isNaN(NaN ** -0.0)
assert 1 ** 1 == 1
assert 2 ** 1 == 2
assert 300 ** 1 == 300
assert -1 ** 1 == -1
assert -2 ** 1 == -2
assert -300 ** 1 == -300
assert 0 ** 1 == 0
assert 1 ** 0 == 1
assert 0 ** 0 == 1
assert 1 ** 5 == 1
assert 5 ** 5 == 3125
assert -5 ** 5 == -3125
assert 5 ** 6 == 15625
assert -5 ** 6 == 15625
assert 1.0 ** 1 == 1.0
assert 2 ** 1.0 == 2.0
assert 300.0 ** 1 == 300.0
assert -1 ** 1.0 == -1.0
assert -2.0 ** 1 == -2.0
assert -300 ** 1.0 == -300.0
assert 0.0 ** 1 == 0.0
assert Number.isNaN(1 ** 0.0)
assert Number.isNaN(0.0 ** 0)
assert 1 ** 5.0 == 1.0
assert 5.0 ** 5 == 3125.0
assert -1.0 ** 1 == -1.0
assert -4.0 ** 3 == -64.0
assert -4 ** 3.0 == -64.0
assert -5 ** 5.0 == -3125.0
assert 5.0 ** 6 == 15625.0
assert -5 ** 6.0 == 15625.0

// Workaround for formatter bug for rational literals
let pow = (**)

assert pow(1/2, 1) == 1/2
assert pow(1/2, 2) == 1/4
assert pow(2, 1 / 2) == 1.4142135623730952
assert pow(4, 1 / 2) == 2
assert pow(4, -1 / 2) == 0.5
assert 9223372036854775809 ** 2 == 85070591730234615884290395931651604481
assert 9223372036854775809 ** 0.5 == 3037000499.97605
assert 9223372036854775809.0 ** 0.5 == 3037000499.97605
assert 9223372036854775809 ** 0 == 1
// TODO(#1168): Use rational literal
let denom = 85070591730234615884290395931651604481
assert Number.pow(9223372036854775809, -2) ==
1 / denom // 1.1754943508222875e-38
assert Number.pow(9223372036854775809, 1/5) == 6208.375056426594
assert Number.pow(9223372036854775809, 2/3) == 4398046511103.9927
assert Number.pow(10223372036854775809, 10) ==
assert 9223372036854775809 ** -2 == 1 / denom // 1.1754943508222875e-38
assert pow(9223372036854775809, 1 / 5) == 6208.375056426594
assert pow(9223372036854775809, 2 / 3) == 4398046511103.9927
assert 10223372036854775809 ** 10 ==
12472159440978016923768615307032788210916694000775261660538874886865415760948494778813645195039710006678013364969179502650466497057008288260604039903029954443675868581729857084924132550246401
assert Number.pow(1, 9223372036854775809) == 1
assert Number.pow(2.0, 9223372036854775809) == Infinity
assert Number.pow(1/2, 2) == 1/4
assert Number.pow(1/2, 3) == 1/8
assert Number.isRational(Number.pow(1/2, 2))
assert Number.isRational(Number.pow(1/2, 3))
assert Number.pow(1/2, -2) == 4
assert 1 ** 9223372036854775809 == 1
assert 2.0 ** 9223372036854775809 == Infinity
assert pow(1/2, 2) == 1/4
assert pow(1/2, 3) == 1/8
assert Number.isRational(pow(1/2, 2))
assert Number.isRational(pow(1/2, 3))
assert pow(1/2, -2) == 4
// exp
assert Number.exp(1) == 2.718281828459045
assert Number.exp(10) == 22026.465794806703
Expand Down
Loading