Skip to content

Commit

Permalink
fix(stdlib): Fix handling of NaN and Infinity in Number module (#…
Browse files Browse the repository at this point in the history
…1457)

feat(stdlib): Add `infinity` constant to the Number module
feat(stdlib): Add `nan` constant to the Number module
chore(docs): Regenerate markdown docs for the Number module
  • Loading branch information
spotandjake committed Nov 7, 2022
1 parent b31120d commit c24f6c1
Show file tree
Hide file tree
Showing 3 changed files with 244 additions and 55 deletions.
69 changes: 61 additions & 8 deletions compiler/test/stdlib/number.test.gr
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ import Float64 from "float64"
import BI from "bigint"

// Constants Test
assert Number.nan != Number.nan

assert Number.infinity == 1.0 / 0.0

assert Number.pi == 3.141592653589793

assert Number.tau == 6.283185307179586
Expand All @@ -15,6 +19,10 @@ assert Number.e == 2.718281828459045
// Operations Tests
// add
assert Number.add(25, 5) == 30
assert Number.add(Number.infinity, 10) == Number.infinity
assert Number.add(Number.infinity, Number.infinity) == Number.infinity
assert Number.isNaN(Number.add(Number.infinity, Number.nan))
assert Number.isNaN(Number.add(Number.nan, Number.nan))
// Rational addition tests
{
let (+) = Number.add
Expand All @@ -28,6 +36,10 @@ assert Number.add(25, 5) == 30
}
// sub
assert Number.sub(25, 5) == 20
assert Number.sub(Number.infinity, 10) == Number.infinity
assert Number.isNaN(Number.sub(Number.infinity, Number.infinity))
assert Number.isNaN(Number.sub(Number.infinity, Number.nan))
assert Number.isNaN(Number.sub(Number.nan, Number.nan))
// Rational subtraction tests
{
let (-) = Number.sub
Expand All @@ -42,7 +54,11 @@ assert Number.sub(25, 5) == 20
}
// mul
assert Number.mul(5, 5) == 25
// Rational mult tests
assert Number.mul(Number.infinity, 10) == Number.infinity
assert Number.mul(Number.infinity, Number.infinity) == Number.infinity
assert Number.isNaN(Number.mul(Number.infinity, Number.nan))
assert Number.isNaN(Number.mul(Number.nan, Number.nan))
// Rational mul tests
{
let (*) = Number.mul
assert 2/3 * 4 == 8/3
Expand All @@ -56,6 +72,10 @@ assert Number.mul(5, 5) == 25
}
// div
assert Number.div(25, 5) == 5
assert Number.div(Number.infinity, 10) == Number.infinity
assert Number.isNaN(Number.div(Number.infinity, Number.infinity))
assert Number.isNaN(Number.div(Number.infinity, Number.nan))
assert Number.isNaN(Number.div(Number.nan, Number.nan))
// Rational div tests
{
let (/) = Number.div
Expand All @@ -74,55 +94,79 @@ assert Number.sqrt(25.0) == 5.0
assert Number.sqrt(35) == 5.916079783099616
assert Number.sqrt(2/4) == 0.7071067811865476
assert Number.sqrt(9266609011276477657) == 3044110545.180066
assert Number.sqrt(Number.infinity) == Number.infinity
assert Number.isNaN(Number.sqrt(Number.nan))
// min
assert Number.min(5, 5) == 5
assert Number.min(5, 6) == 5
assert Number.min(6, 5) == 5
assert Number.min(1/2, 1/4) == 1/4
assert Number.min(0.5, 0.25) == 0.25
assert Number.min(355894508425808343204914141312, 6) == 6
assert Number.min(Number.infinity, 10) == 10
assert Number.isNaN(Number.min(Number.nan, 10))
assert Number.isNaN(Number.min(Number.nan, Number.infinity))

// max
assert Number.max(5, 5) == 5
assert Number.max(6, 5) == 6
assert Number.max(5, 6) == 6
assert Number.max(1/2, 1/4) == 1/2
assert Number.max(0.5, 0.25) == 0.5
assert Number.max(BI.toNumber(1234t), BI.toNumber(12t)) == BI.toNumber(1234t)
assert Number.max(355894508425808343204914141312, 6) ==
355894508425808343204914141312
assert Number.max(Number.infinity, 10) == Number.infinity
assert Number.max(Number.nan, 10) == 10
assert Number.max(Number.nan, Number.infinity) == Number.infinity

// ceil
assert Number.ceil(-25.5) == -25
assert Number.ceil(25.5) == 26
assert Number.ceil(25) == 25
assert Number.ceil(22/7) == 4
assert Number.ceil(BI.toNumber(1234t)) == BI.toNumber(1234t)
assert Number.isNaN(Number.ceil(Number.nan))
assert Number.ceil(Number.infinity) == Number.infinity
// floor
assert Number.floor(-25.5) == -26
assert Number.floor(25.5) == 25
assert Number.floor(25) == 25
assert Number.floor(22/7) == 3
assert Number.floor(BI.toNumber(1234t)) == BI.toNumber(1234t)
assert Number.isNaN(Number.floor(Number.nan))
assert Number.floor(Number.infinity) == Number.infinity
// trunc
assert Number.trunc(-25.5) == -25
assert Number.trunc(25.5) == 25
assert Number.trunc(25) == 25
assert Number.trunc(22/7) == 3
assert Number.trunc(BI.toNumber(1234t)) == BI.toNumber(1234t)
assert Number.isNaN(Number.trunc(Number.nan))
assert Number.trunc(Number.infinity) == Number.infinity
// round
assert Number.round(-25.5) == -26
assert Number.round(-25.25) == -25
assert Number.round(25.25) == 25
assert Number.round(25.5) == 26
assert Number.round(22/7) == 3
assert Number.round(BI.toNumber(1234t)) == BI.toNumber(1234t)
assert Number.isNaN(Number.round(Number.nan))
assert Number.round(Number.infinity) == Number.infinity
// abs
assert Number.abs(-25.5) == 25.5
assert Number.abs(25.5) == 25.5
assert Number.abs(-1/2) == 1/2
assert Number.isNaN(Number.abs(Number.nan))
assert Number.abs(Number.infinity) == Number.infinity
// neg
assert Number.neg(-25.5) == 25.5
assert Number.neg(25.5) == -25.5
assert Number.neg(1/2) == -1/2
assert Number.neg(BI.toNumber(1234t)) == BI.toNumber(-1234t)
assert Number.neg(BI.toNumber(-1234t)) == BI.toNumber(1234t)
assert Number.isNaN(Number.neg(Number.nan))
assert Number.neg(Number.infinity) == Number.infinity * -1

// isFloat
assert Number.isFloat(0.0)
Expand All @@ -132,7 +176,8 @@ assert Number.isFloat(9e6)
assert Number.isFloat(0) == false
assert Number.isFloat(10) == false
assert Number.isFloat(2/3) == false

assert Number.isFloat(Number.infinity) == true
assert Number.isFloat(Number.nan) == true
// isInteger
assert Number.isInteger(0)
assert Number.isInteger(9)
Expand All @@ -141,16 +186,20 @@ assert Number.isInteger(9_223_372_036_854_775_808)
assert Number.isInteger(0.0) == false
assert Number.isInteger(9e6) == false
assert Number.isInteger(2/3) == false
assert Number.isInteger(Number.infinity) == false
assert Number.isInteger(Number.nan) == false

// isRational
assert Number.isRational(1/2)
assert Number.isRational(6/5)
assert Number.isRational(1) == false
assert Number.isRational(1.5) == false
assert Number.isRational(Number.infinity) == false
assert Number.isRational(Number.nan) == false

// isFinite
assert Number.isFinite(0.0 / 0.0) == false // NaN
assert Number.isFinite(1.0 / 0.0) == false // infinity
assert Number.isFinite(Number.nan) == false // NaN
assert Number.isFinite(Number.infinity) == false // infinity
assert Number.isFinite(-1.0 / 0.0) == false // -infinity
assert Number.isFinite(1)
assert Number.isFinite(1.0)
Expand All @@ -165,7 +214,7 @@ assert Number.isFinite(-1/2)
assert Number.isFinite(BI.toNumber(-141435902485091384901384t))

// isNaN
assert Number.isNaN(0.0 / 0.0)
assert Number.isNaN(Number.nan)
assert Number.isNaN(1) == false
assert Number.isNaN(1.0) == false
assert Number.isNaN(0) == false
Expand All @@ -176,14 +225,14 @@ assert Number.isNaN(25.76) == false
assert Number.isNaN(-25.00) == false
assert Number.isNaN(1/2) == false
assert Number.isNaN(-1/2) == false
assert Number.isNaN(1.0 / 0.0) == false // infinity
assert Number.isNaN(Number.infinity) == false // infinity
assert Number.isNaN(-1.0 / 0.0) == false // -infinity
assert Number.isNaN(BI.toNumber(1t)) == false

// isInfinite
assert Number.isInfinite(1.0 / 0.0) // infinity
assert Number.isInfinite(Number.infinity) // infinity
assert Number.isInfinite(-1.0 / 0.0) // -infinity
assert Number.isInfinite(0.0 / 0.0) == false // NaN
assert Number.isInfinite(Number.nan) == false // NaN
assert Number.isInfinite(1) == false
assert Number.isInfinite(1.0) == false
assert Number.isInfinite(0) == false
Expand Down Expand Up @@ -251,8 +300,12 @@ assert Number.sin(0.0) == 0
assert Number.sin(1) > 0.84147 && Number.sin(1) < 0.84148
assert Number.sin(-1) < -0.84147 && Number.sin(-1) > -0.84148
assert Number.sin(20) > 0.91294 && Number.sin(20) < 0.91295
assert Number.isNaN(Number.sin(Number.infinity))
assert Number.isNaN(Number.sin(Number.nan))

// Number.cos
assert Number.cos(1) > 0.5403 && Number.cos(1) < 0.5404
assert Number.cos(-1) > 0.5403 && Number.cos(-1) < 0.5404
assert Number.cos(15) < -0.7596 && Number.cos(15) > -0.7597
assert Number.isNaN(Number.cos(Number.infinity))
assert Number.isNaN(Number.cos(Number.nan))
Loading

0 comments on commit c24f6c1

Please sign in to comment.