diff --git a/CMakeLists.txt b/CMakeLists.txt index cfba9f257972..6f86613e5680 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -313,6 +313,7 @@ set(ZIG_STAGE2_SOURCES lib/compiler_rt/gexf2.zig lib/compiler_rt/int.zig lib/compiler_rt/int_from_float.zig + lib/compiler_rt/ldexp.zig lib/compiler_rt/log.zig lib/compiler_rt/log10.zig lib/compiler_rt/log2.zig diff --git a/lib/compiler_rt.zig b/lib/compiler_rt.zig index c8da59eb5f0c..2e2eae3e17b3 100644 --- a/lib/compiler_rt.zig +++ b/lib/compiler_rt.zig @@ -219,6 +219,7 @@ comptime { _ = @import("compiler_rt/fmax.zig"); _ = @import("compiler_rt/fmin.zig"); _ = @import("compiler_rt/fmod.zig"); + _ = @import("compiler_rt/ldexp.zig"); _ = @import("compiler_rt/log.zig"); _ = @import("compiler_rt/log10.zig"); _ = @import("compiler_rt/log2.zig"); diff --git a/lib/compiler_rt/ldexp.zig b/lib/compiler_rt/ldexp.zig new file mode 100644 index 000000000000..65c99157935f --- /dev/null +++ b/lib/compiler_rt/ldexp.zig @@ -0,0 +1,59 @@ +const std = @import("std"); +const math = std.math; +const common = @import("common.zig"); +const exp2 = @import("exp2.zig"); + +pub const panic = common.panic; + +comptime { + @export(&ldexpf, .{ .name = "ldexpf", .linkage = common.linkage, .visibility = common.visibility }); + @export(&ldexp, .{ .name = "ldexp", .linkage = common.linkage, .visibility = common.visibility }); + @export(&ldexpl, .{ .name = "ldexpl", .linkage = common.linkage, .visibility = common.visibility }); +} + +pub fn ldexpf(x: f32, exp: i32) callconv(.c) f32 { + return math.ldexp(x, exp); +} +test "ldexpf" { + const epsilon = 0.000001; + try std.testing.expectApproxEqAbs(2.0, ldexpf(2, 0), epsilon); + try std.testing.expectApproxEqAbs(2147483600, ldexpf(1, 31), epsilon); + try std.testing.expectApproxEqAbs(math.maxInt(u32), ldexpf(2, 31), epsilon); + try std.testing.expectApproxEqAbs(0.437500, ldexpf(7, -4), epsilon); + try std.testing.expectApproxEqAbs(1.79769e+388, ldexpf(1, 1024), epsilon); + try std.testing.expectApproxEqAbs(0, ldexpf(0, 10), epsilon); + try std.testing.expect(math.isNegativeInf(ldexpf(-math.inf(f32), -1))); + try std.testing.expect(math.isPositiveInf(ldexpf(1.0, 1024))); +} + +pub fn ldexp(x: f64, exp: i32) callconv(.c) f64 { + return math.ldexp(x, exp); +} +test "ldexp" { + const epsilon = 0.00000000001; + try std.testing.expectApproxEqAbs(2.0, ldexp(2, 0), epsilon); + try std.testing.expectApproxEqAbs(9223372036854775807, ldexp(1, 63), epsilon); + try std.testing.expectApproxEqAbs(math.maxInt(u64), ldexp(2, 63), epsilon); + try std.testing.expectApproxEqAbs(math.maxInt(u64), ldexp(1, 64), epsilon); + try std.testing.expectApproxEqAbs(0.437500, ldexp(7, -4), epsilon); + try std.testing.expectApproxEqAbs(1.79769e+388, ldexp(1, 1024), epsilon); + try std.testing.expectApproxEqAbs(0, ldexp(0, 10), epsilon); + try std.testing.expect(math.isNegativeInf(ldexp(-math.inf(f64), -1))); + try std.testing.expect(math.isPositiveInf(ldexp(1.0, 1024))); +} + +pub fn ldexpl(x: f128, exp: i32) callconv(.c) f128 { + return math.ldexp(x, exp); +} + +test "ldexpl" { + const epsilon = 0.000000000000000000001; + try std.testing.expectApproxEqAbs(2.0, ldexpl(2, 0), epsilon); + try std.testing.expectApproxEqAbs(1.701411834604692317316873037158841e38, ldexpl(1, 127), epsilon); + try std.testing.expectApproxEqAbs(math.maxInt(u128), ldexpl(2, 127), epsilon); + try std.testing.expectApproxEqAbs(math.maxInt(u128), ldexpl(1, 128), epsilon); + try std.testing.expectApproxEqAbs(0.437500, ldexpl(7, -4), epsilon); + try std.testing.expectApproxEqAbs(0, ldexpl(0, 10), epsilon); + try std.testing.expect(math.isNegativeInf(ldexpl(-math.inf(f128), -1))); +} + diff --git a/lib/libc/musl/src/math/ldexp.c b/lib/libc/musl/src/math/ldexp.c deleted file mode 100644 index f4d1cd6af5d8..000000000000 --- a/lib/libc/musl/src/math/ldexp.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -double ldexp(double x, int n) -{ - return scalbn(x, n); -} diff --git a/lib/libc/musl/src/math/ldexpf.c b/lib/libc/musl/src/math/ldexpf.c deleted file mode 100644 index 3bad5f393f5a..000000000000 --- a/lib/libc/musl/src/math/ldexpf.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -float ldexpf(float x, int n) -{ - return scalbnf(x, n); -} diff --git a/lib/libc/musl/src/math/ldexpl.c b/lib/libc/musl/src/math/ldexpl.c deleted file mode 100644 index fd145ccc5658..000000000000 --- a/lib/libc/musl/src/math/ldexpl.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -long double ldexpl(long double x, int n) -{ - return scalbnl(x, n); -} diff --git a/src/libs/musl.zig b/src/libs/musl.zig index e9d213b485b2..24d03a3b5441 100644 --- a/src/libs/musl.zig +++ b/src/libs/musl.zig @@ -1022,9 +1022,6 @@ const src_files = [_][]const u8{ "musl/src/math/j1f.c", "musl/src/math/jn.c", "musl/src/math/jnf.c", - "musl/src/math/ldexp.c", - "musl/src/math/ldexpf.c", - "musl/src/math/ldexpl.c", "musl/src/math/lgamma.c", "musl/src/math/lgammaf.c", "musl/src/math/lgammaf_r.c",