diff --git a/stdlib/math.codon b/stdlib/math.codon index 8c2c621b..2161a8f6 100644 --- a/stdlib/math.codon +++ b/stdlib/math.codon @@ -111,9 +111,9 @@ def _check2(x: float, y: float, r: float, can_overflow: bool = False): return r -def ceil(x: float) -> float: +def ceil(x: float) -> int: """ - ceil(float) -> float + ceil(float) -> int Return the ceiling of x as an Integral. This is the smallest integer >= x. @@ -125,11 +125,11 @@ def ceil(x: float) -> float: %y = call double @llvm.ceil.f64(double %x) ret double %y - return f(x) + return int(f(x)) -def floor(x: float) -> float: +def floor(x: float) -> int: """ - floor(float) -> float + floor(float) -> int Return the floor of x as an Integral. This is the largest integer <= x. @@ -141,7 +141,7 @@ def floor(x: float) -> float: %y = call double @llvm.floor.f64(double %x) ret double %y - return f(x) + return int(f(x)) def fabs(x: float) -> float: """ @@ -454,9 +454,9 @@ def log1p(x: float) -> float: """ return _check1(x, _C.log1p(x)) -def trunc(x: float) -> float: +def trunc(x: float) -> int: """ - trunc(float) -> float + trunc(float) -> int Return the Real value x truncated to an Integral (usually an integer). @@ -468,7 +468,7 @@ def trunc(x: float) -> float: %y = call double @llvm.trunc.f64(double %x) ret double %y - return _check1(x, f(x)) + return int(_check1(x, f(x))) def erf(x: float) -> float: """ @@ -797,9 +797,9 @@ def isfinite(x: float32) -> bool: return not (isnan(x) or isinf(x)) @overload -def ceil(x: float32) -> float32: +def ceil(x: float32) -> int: """ - ceil(float32) -> float32 + ceil(float32) -> int Return the ceiling of x as an Integral. This is the smallest integer >= x. @@ -811,12 +811,12 @@ def ceil(x: float32) -> float32: %y = call float @llvm.ceil.f32(float %x) ret float %y - return f(x) + return int(f(x)) @overload -def floor(x: float32) -> float32: +def floor(x: float32) -> int: """ - floor(float32) -> float32 + floor(float32) -> int Return the floor of x as an Integral. This is the largest integer <= x. @@ -828,7 +828,7 @@ def floor(x: float32) -> float32: %y = call float @llvm.floor.f32(float %x) ret float %y - return f(x) + return int(f(x)) @overload def fabs(x: float32) -> float32: @@ -1170,9 +1170,9 @@ def log1p(x: float32) -> float32: return _C.log1pf(x) @overload -def trunc(x: float32) -> float32: +def trunc(x: float32) -> int: """ - trunc(float32) -> float32 + trunc(float32) -> int Return the Real value x truncated to an Integral (usually an integer). @@ -1184,7 +1184,7 @@ def trunc(x: float32) -> float32: %y = call float @llvm.trunc.f32(float %x) ret float %y - return f(x) + return int(f(x)) @overload def erf(x: float32) -> float32: diff --git a/test/stdlib/math_test.codon b/test/stdlib/math_test.codon index b4befc03..ceec89f5 100644 --- a/test/stdlib/math_test.codon +++ b/test/stdlib/math_test.codon @@ -32,6 +32,7 @@ def test_isfinite(): @test def test_ceil(): + assert isinstance(math.ceil(1.0), int) assert math.ceil(3.3) == 4 assert math.ceil(0.5) == 1 assert math.ceil(1.0) == 1 @@ -43,6 +44,7 @@ def test_ceil(): @test def test_floor(): + assert isinstance(math.floor(1.0), int) assert math.floor(3.3) == 3 assert math.floor(0.5) == 0 assert math.floor(1.0) == 1 @@ -344,6 +346,7 @@ def test_log1p(): @test def test_trunc(): + assert isinstance(math.trunc(1.0), int) assert math.trunc(1.0) == 1 assert math.trunc(-1.0) == -1 assert math.trunc(1.5) == 1 @@ -813,24 +816,26 @@ def test_float32_isfinite(): @test def test_float32_ceil(): - assert math.ceil(3.3f32) == 4.0f32 - assert math.ceil(0.5f32) == 1.0f32 - assert math.ceil(1.0f32) == 1.0f32 - assert math.ceil(1.5f32) == 2.0f32 - assert math.ceil(-0.5f32) == 0.0f32 - assert math.ceil(-1.0f32) == -1.0f32 - assert math.ceil(-1.5f32) == -1.0f32 + assert isinstance(math.ceil(1.0f32), int) + assert math.ceil(3.3f32) == 4 + assert math.ceil(0.5f32) == 1 + assert math.ceil(1.0f32) == 1 + assert math.ceil(1.5f32) == 2 + assert math.ceil(-0.5f32) == 0 + assert math.ceil(-1.0f32) == -1 + assert math.ceil(-1.5f32) == -1 @test def test_float32_floor(): - assert math.floor(3.3f32) == 3.0f32 - assert math.floor(0.5f32) == 0.0f32 - assert math.floor(1.0f32) == 1.0f32 - assert math.floor(1.5f32) == 1.0f32 - assert math.floor(-0.5f32) == -1.0f32 - assert math.floor(-1.0f32) == -1.0f32 - assert math.floor(-1.5f32) == -2.0f32 + assert isinstance(math.floor(1.0f32), int) + assert math.floor(3.3f32) == 3 + assert math.floor(0.5f32) == 0 + assert math.floor(1.0f32) == 1 + assert math.floor(1.5f32) == 1 + assert math.floor(-0.5f32) == -1 + assert math.floor(-1.0f32) == -1 + assert math.floor(-1.5f32) == -2 @test @@ -1124,14 +1129,15 @@ def test_float32_log1p(): @test def test_float32_trunc(): - assert math.trunc(1.0f32) == 1.0f32 - assert math.trunc(-1.0f32) == -1.0f32 - assert math.trunc(1.5f32) == 1.0f32 - assert math.trunc(-1.5f32) == -1.0f32 - assert math.trunc(1.99999f32) == 1.0f32 - assert math.trunc(-1.99999f32) == -1.0f32 - assert math.trunc(0.99999f32) == 0.0f32 - assert math.trunc(-100.999f32) == -100.0f32 + assert isinstance(math.trunc(1.0f32), int) + assert math.trunc(1.0f32) == 1 + assert math.trunc(-1.0f32) == -1 + assert math.trunc(1.5f32) == 1 + assert math.trunc(-1.5f32) == -1 + assert math.trunc(1.99999f32) == 1 + assert math.trunc(-1.99999f32) == -1 + assert math.trunc(0.99999f32) == 0 + assert math.trunc(-100.999f32) == -100 @test