From ed36dbbd9c9dc21b2eebae1b31586fea1c6b51c3 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 25 Sep 2019 23:35:41 -0400 Subject: mv std/ lib/ that's all this commit does. further commits will fix cli flags and such. see #2221 --- lib/std/math/isfinite.zig | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 lib/std/math/isfinite.zig (limited to 'lib/std/math/isfinite.zig') diff --git a/lib/std/math/isfinite.zig b/lib/std/math/isfinite.zig new file mode 100644 index 0000000000..99eba668f9 --- /dev/null +++ b/lib/std/math/isfinite.zig @@ -0,0 +1,41 @@ +const std = @import("../std.zig"); +const math = std.math; +const expect = std.testing.expect; +const maxInt = std.math.maxInt; + +/// Returns whether x is a finite value. +pub fn isFinite(x: var) bool { + const T = @typeOf(x); + switch (T) { + f16 => { + const bits = @bitCast(u16, x); + return bits & 0x7FFF < 0x7C00; + }, + f32 => { + const bits = @bitCast(u32, x); + return bits & 0x7FFFFFFF < 0x7F800000; + }, + f64 => { + const bits = @bitCast(u64, x); + return bits & (maxInt(u64) >> 1) < (0x7FF << 52); + }, + else => { + @compileError("isFinite not implemented for " ++ @typeName(T)); + }, + } +} + +test "math.isFinite" { + expect(isFinite(f16(0.0))); + expect(isFinite(f16(-0.0))); + expect(isFinite(f32(0.0))); + expect(isFinite(f32(-0.0))); + expect(isFinite(f64(0.0))); + expect(isFinite(f64(-0.0))); + expect(!isFinite(math.inf(f16))); + expect(!isFinite(-math.inf(f16))); + expect(!isFinite(math.inf(f32))); + expect(!isFinite(-math.inf(f32))); + expect(!isFinite(math.inf(f64))); + expect(!isFinite(-math.inf(f64))); +} -- cgit v1.2.3