Skip to content

Commit c24f6c1

Browse files
authored
fix(stdlib): Fix handling of NaN and Infinity in Number module (#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
1 parent b31120d commit c24f6c1

File tree

3 files changed

+244
-55
lines changed

3 files changed

+244
-55
lines changed

compiler/test/stdlib/number.test.gr

Lines changed: 61 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ import Float64 from "float64"
77
import BI from "bigint"
88

99
// Constants Test
10+
assert Number.nan != Number.nan
11+
12+
assert Number.infinity == 1.0 / 0.0
13+
1014
assert Number.pi == 3.141592653589793
1115

1216
assert Number.tau == 6.283185307179586
@@ -15,6 +19,10 @@ assert Number.e == 2.718281828459045
1519
// Operations Tests
1620
// add
1721
assert Number.add(25, 5) == 30
22+
assert Number.add(Number.infinity, 10) == Number.infinity
23+
assert Number.add(Number.infinity, Number.infinity) == Number.infinity
24+
assert Number.isNaN(Number.add(Number.infinity, Number.nan))
25+
assert Number.isNaN(Number.add(Number.nan, Number.nan))
1826
// Rational addition tests
1927
{
2028
let (+) = Number.add
@@ -28,6 +36,10 @@ assert Number.add(25, 5) == 30
2836
}
2937
// sub
3038
assert Number.sub(25, 5) == 20
39+
assert Number.sub(Number.infinity, 10) == Number.infinity
40+
assert Number.isNaN(Number.sub(Number.infinity, Number.infinity))
41+
assert Number.isNaN(Number.sub(Number.infinity, Number.nan))
42+
assert Number.isNaN(Number.sub(Number.nan, Number.nan))
3143
// Rational subtraction tests
3244
{
3345
let (-) = Number.sub
@@ -42,7 +54,11 @@ assert Number.sub(25, 5) == 20
4254
}
4355
// mul
4456
assert Number.mul(5, 5) == 25
45-
// Rational mult tests
57+
assert Number.mul(Number.infinity, 10) == Number.infinity
58+
assert Number.mul(Number.infinity, Number.infinity) == Number.infinity
59+
assert Number.isNaN(Number.mul(Number.infinity, Number.nan))
60+
assert Number.isNaN(Number.mul(Number.nan, Number.nan))
61+
// Rational mul tests
4662
{
4763
let (*) = Number.mul
4864
assert 2/3 * 4 == 8/3
@@ -56,6 +72,10 @@ assert Number.mul(5, 5) == 25
5672
}
5773
// div
5874
assert Number.div(25, 5) == 5
75+
assert Number.div(Number.infinity, 10) == Number.infinity
76+
assert Number.isNaN(Number.div(Number.infinity, Number.infinity))
77+
assert Number.isNaN(Number.div(Number.infinity, Number.nan))
78+
assert Number.isNaN(Number.div(Number.nan, Number.nan))
5979
// Rational div tests
6080
{
6181
let (/) = Number.div
@@ -74,55 +94,79 @@ assert Number.sqrt(25.0) == 5.0
7494
assert Number.sqrt(35) == 5.916079783099616
7595
assert Number.sqrt(2/4) == 0.7071067811865476
7696
assert Number.sqrt(9266609011276477657) == 3044110545.180066
97+
assert Number.sqrt(Number.infinity) == Number.infinity
98+
assert Number.isNaN(Number.sqrt(Number.nan))
7799
// min
100+
assert Number.min(5, 5) == 5
78101
assert Number.min(5, 6) == 5
79102
assert Number.min(6, 5) == 5
80103
assert Number.min(1/2, 1/4) == 1/4
81104
assert Number.min(0.5, 0.25) == 0.25
82105
assert Number.min(355894508425808343204914141312, 6) == 6
106+
assert Number.min(Number.infinity, 10) == 10
107+
assert Number.isNaN(Number.min(Number.nan, 10))
108+
assert Number.isNaN(Number.min(Number.nan, Number.infinity))
109+
83110
// max
111+
assert Number.max(5, 5) == 5
84112
assert Number.max(6, 5) == 6
85113
assert Number.max(5, 6) == 6
86114
assert Number.max(1/2, 1/4) == 1/2
87115
assert Number.max(0.5, 0.25) == 0.5
88116
assert Number.max(BI.toNumber(1234t), BI.toNumber(12t)) == BI.toNumber(1234t)
89117
assert Number.max(355894508425808343204914141312, 6) ==
90118
355894508425808343204914141312
119+
assert Number.max(Number.infinity, 10) == Number.infinity
120+
assert Number.max(Number.nan, 10) == 10
121+
assert Number.max(Number.nan, Number.infinity) == Number.infinity
122+
91123
// ceil
92124
assert Number.ceil(-25.5) == -25
93125
assert Number.ceil(25.5) == 26
94126
assert Number.ceil(25) == 25
95127
assert Number.ceil(22/7) == 4
96128
assert Number.ceil(BI.toNumber(1234t)) == BI.toNumber(1234t)
129+
assert Number.isNaN(Number.ceil(Number.nan))
130+
assert Number.ceil(Number.infinity) == Number.infinity
97131
// floor
98132
assert Number.floor(-25.5) == -26
99133
assert Number.floor(25.5) == 25
100134
assert Number.floor(25) == 25
101135
assert Number.floor(22/7) == 3
102136
assert Number.floor(BI.toNumber(1234t)) == BI.toNumber(1234t)
137+
assert Number.isNaN(Number.floor(Number.nan))
138+
assert Number.floor(Number.infinity) == Number.infinity
103139
// trunc
104140
assert Number.trunc(-25.5) == -25
105141
assert Number.trunc(25.5) == 25
106142
assert Number.trunc(25) == 25
107143
assert Number.trunc(22/7) == 3
108144
assert Number.trunc(BI.toNumber(1234t)) == BI.toNumber(1234t)
145+
assert Number.isNaN(Number.trunc(Number.nan))
146+
assert Number.trunc(Number.infinity) == Number.infinity
109147
// round
110148
assert Number.round(-25.5) == -26
111149
assert Number.round(-25.25) == -25
112150
assert Number.round(25.25) == 25
113151
assert Number.round(25.5) == 26
114152
assert Number.round(22/7) == 3
115153
assert Number.round(BI.toNumber(1234t)) == BI.toNumber(1234t)
154+
assert Number.isNaN(Number.round(Number.nan))
155+
assert Number.round(Number.infinity) == Number.infinity
116156
// abs
117157
assert Number.abs(-25.5) == 25.5
118158
assert Number.abs(25.5) == 25.5
119159
assert Number.abs(-1/2) == 1/2
160+
assert Number.isNaN(Number.abs(Number.nan))
161+
assert Number.abs(Number.infinity) == Number.infinity
120162
// neg
121163
assert Number.neg(-25.5) == 25.5
122164
assert Number.neg(25.5) == -25.5
123165
assert Number.neg(1/2) == -1/2
124166
assert Number.neg(BI.toNumber(1234t)) == BI.toNumber(-1234t)
125167
assert Number.neg(BI.toNumber(-1234t)) == BI.toNumber(1234t)
168+
assert Number.isNaN(Number.neg(Number.nan))
169+
assert Number.neg(Number.infinity) == Number.infinity * -1
126170

127171
// isFloat
128172
assert Number.isFloat(0.0)
@@ -132,7 +176,8 @@ assert Number.isFloat(9e6)
132176
assert Number.isFloat(0) == false
133177
assert Number.isFloat(10) == false
134178
assert Number.isFloat(2/3) == false
135-
179+
assert Number.isFloat(Number.infinity) == true
180+
assert Number.isFloat(Number.nan) == true
136181
// isInteger
137182
assert Number.isInteger(0)
138183
assert Number.isInteger(9)
@@ -141,16 +186,20 @@ assert Number.isInteger(9_223_372_036_854_775_808)
141186
assert Number.isInteger(0.0) == false
142187
assert Number.isInteger(9e6) == false
143188
assert Number.isInteger(2/3) == false
189+
assert Number.isInteger(Number.infinity) == false
190+
assert Number.isInteger(Number.nan) == false
144191

145192
// isRational
146193
assert Number.isRational(1/2)
147194
assert Number.isRational(6/5)
148195
assert Number.isRational(1) == false
149196
assert Number.isRational(1.5) == false
197+
assert Number.isRational(Number.infinity) == false
198+
assert Number.isRational(Number.nan) == false
150199

151200
// isFinite
152-
assert Number.isFinite(0.0 / 0.0) == false // NaN
153-
assert Number.isFinite(1.0 / 0.0) == false // infinity
201+
assert Number.isFinite(Number.nan) == false // NaN
202+
assert Number.isFinite(Number.infinity) == false // infinity
154203
assert Number.isFinite(-1.0 / 0.0) == false // -infinity
155204
assert Number.isFinite(1)
156205
assert Number.isFinite(1.0)
@@ -165,7 +214,7 @@ assert Number.isFinite(-1/2)
165214
assert Number.isFinite(BI.toNumber(-141435902485091384901384t))
166215

167216
// isNaN
168-
assert Number.isNaN(0.0 / 0.0)
217+
assert Number.isNaN(Number.nan)
169218
assert Number.isNaN(1) == false
170219
assert Number.isNaN(1.0) == false
171220
assert Number.isNaN(0) == false
@@ -176,14 +225,14 @@ assert Number.isNaN(25.76) == false
176225
assert Number.isNaN(-25.00) == false
177226
assert Number.isNaN(1/2) == false
178227
assert Number.isNaN(-1/2) == false
179-
assert Number.isNaN(1.0 / 0.0) == false // infinity
228+
assert Number.isNaN(Number.infinity) == false // infinity
180229
assert Number.isNaN(-1.0 / 0.0) == false // -infinity
181230
assert Number.isNaN(BI.toNumber(1t)) == false
182231

183232
// isInfinite
184-
assert Number.isInfinite(1.0 / 0.0) // infinity
233+
assert Number.isInfinite(Number.infinity) // infinity
185234
assert Number.isInfinite(-1.0 / 0.0) // -infinity
186-
assert Number.isInfinite(0.0 / 0.0) == false // NaN
235+
assert Number.isInfinite(Number.nan) == false // NaN
187236
assert Number.isInfinite(1) == false
188237
assert Number.isInfinite(1.0) == false
189238
assert Number.isInfinite(0) == false
@@ -251,8 +300,12 @@ assert Number.sin(0.0) == 0
251300
assert Number.sin(1) > 0.84147 && Number.sin(1) < 0.84148
252301
assert Number.sin(-1) < -0.84147 && Number.sin(-1) > -0.84148
253302
assert Number.sin(20) > 0.91294 && Number.sin(20) < 0.91295
303+
assert Number.isNaN(Number.sin(Number.infinity))
304+
assert Number.isNaN(Number.sin(Number.nan))
254305

255306
// Number.cos
256307
assert Number.cos(1) > 0.5403 && Number.cos(1) < 0.5404
257308
assert Number.cos(-1) > 0.5403 && Number.cos(-1) < 0.5404
258309
assert Number.cos(15) < -0.7596 && Number.cos(15) > -0.7597
310+
assert Number.isNaN(Number.cos(Number.infinity))
311+
assert Number.isNaN(Number.cos(Number.nan))

0 commit comments

Comments
 (0)