diff options
| author | Jonathan S <gereeter+code@gmail.com> | 2022-01-29 10:11:49 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-01-29 18:11:49 +0200 |
| commit | aca665cebd2b6ec9ec3db669cf5446ee45bbb5d0 (patch) | |
| tree | d06c19e46393f5ec0ae7a700cf5eb2e3507fbf21 /lib/std/math | |
| parent | ba445013c472abd874f7b041d9ad8f3c72197807 (diff) | |
| download | zig-aca665cebd2b6ec9ec3db669cf5446ee45bbb5d0.tar.gz zig-aca665cebd2b6ec9ec3db669cf5446ee45bbb5d0.zip | |
Fix overflow in std.math.isNormal when applied to -Inf or a negative NaN
Diffstat (limited to 'lib/std/math')
| -rw-r--r-- | lib/std/math/isnormal.zig | 20 |
1 files 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))); |
