From aca665cebd2b6ec9ec3db669cf5446ee45bbb5d0 Mon Sep 17 00:00:00 2001 From: Jonathan S Date: Sat, 29 Jan 2022 10:11:49 -0600 Subject: [PATCH] Fix overflow in std.math.isNormal when applied to -Inf or a negative NaN --- lib/std/math/isnormal.zig | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/std/math/isnormal.zig b/lib/std/math/isnormal.zig index 0430e1367a..88e186a3c9 100644 --- a/lib/std/math/isnormal.zig +++ b/lib/std/math/isnormal.zig @@ -9,19 +9,19 @@ pub fn isNormal(x: anytype) bool { switch (T) { f16 => { const bits = @bitCast(u16, x); - return (bits + (1 << 10)) & (maxInt(u16) >> 1) >= (1 << 11); + return (bits +% (1 << 10)) & (maxInt(u16) >> 1) >= (1 << 11); }, f32 => { const bits = @bitCast(u32, x); - return (bits + (1 << 23)) & (maxInt(u32) >> 1) >= (1 << 24); + return (bits +% (1 << 23)) & (maxInt(u32) >> 1) >= (1 << 24); }, f64 => { const bits = @bitCast(u64, x); - return (bits + (1 << 52)) & (maxInt(u64) >> 1) >= (1 << 53); + return (bits +% (1 << 52)) & (maxInt(u64) >> 1) >= (1 << 53); }, f128 => { const bits = @bitCast(u128, x); - return (bits + (1 << 112)) & (maxInt(u128) >> 1) >= (1 << 113); + return (bits +% (1 << 112)) & (maxInt(u128) >> 1) >= (1 << 113); }, else => { @compileError("isNormal not implemented for " ++ @typeName(T)); @@ -34,6 +34,18 @@ test "math.isNormal" { try expect(!isNormal(math.nan(f32))); try expect(!isNormal(math.nan(f64))); try expect(!isNormal(math.nan(f128))); + try expect(!isNormal(-math.nan(f16))); + try expect(!isNormal(-math.nan(f32))); + try expect(!isNormal(-math.nan(f64))); + try expect(!isNormal(-math.nan(f128))); + try expect(!isNormal(math.inf(f16))); + try expect(!isNormal(math.inf(f32))); + try expect(!isNormal(math.inf(f64))); + try expect(!isNormal(math.inf(f128))); + try expect(!isNormal(-math.inf(f16))); + try expect(!isNormal(-math.inf(f32))); + try expect(!isNormal(-math.inf(f64))); + try expect(!isNormal(-math.inf(f128))); try expect(!isNormal(@as(f16, 0))); try expect(!isNormal(@as(f32, 0))); try expect(!isNormal(@as(f64, 0)));