Commit a36d7b6131

Ben Noordhuis <info@bnoordhuis.nl>
2018-06-30 01:44:54
add std.math f16 inf support
refs #1122
1 parent 27b0241
Changed files (3)
std/math/index.zig
@@ -28,6 +28,9 @@ pub const f16_toint = 1.0 / f16_epsilon;
 pub const nan_u16 = u16(0x7C01);
 pub const nan_f16 = @bitCast(f16, nan_u16);
 
+pub const inf_u16 = u16(0x7C00);
+pub const inf_f16 = @bitCast(f16, inf_u16);
+
 pub const nan_u32 = u32(0x7F800001);
 pub const nan_f32 = @bitCast(f32, nan_u32);
 
std/math/inf.zig
@@ -1,9 +1,9 @@
 const std = @import("../index.zig");
 const math = std.math;
-const assert = std.debug.assert;
 
 pub fn inf(comptime T: type) T {
     return switch (T) {
+        f16 => @bitCast(f16, math.inf_u16),
         f32 => @bitCast(f32, math.inf_u32),
         f64 => @bitCast(f64, math.inf_u64),
         else => @compileError("inf not implemented for " ++ @typeName(T)),
std/math/isinf.zig
@@ -5,6 +5,10 @@ const assert = std.debug.assert;
 pub fn isInf(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;
@@ -22,6 +26,9 @@ pub fn isInf(x: var) bool {
 pub fn isPositiveInf(x: var) bool {
     const T = @typeOf(x);
     switch (T) {
+        f16 => {
+            return @bitCast(u16, x) == 0x7C00;
+        },
         f32 => {
             return @bitCast(u32, x) == 0x7F800000;
         },
@@ -37,6 +44,9 @@ pub fn isPositiveInf(x: var) bool {
 pub fn isNegativeInf(x: var) bool {
     const T = @typeOf(x);
     switch (T) {
+        f16 => {
+            return @bitCast(u16, x) == 0xFC00;
+        },
         f32 => {
             return @bitCast(u32, x) == 0xFF800000;
         },
@@ -50,10 +60,14 @@ pub fn isNegativeInf(x: var) bool {
 }
 
 test "math.isInf" {
+    assert(!isInf(f16(0.0)));
+    assert(!isInf(f16(-0.0)));
     assert(!isInf(f32(0.0)));
     assert(!isInf(f32(-0.0)));
     assert(!isInf(f64(0.0)));
     assert(!isInf(f64(-0.0)));
+    assert(isInf(math.inf(f16)));
+    assert(isInf(-math.inf(f16)));
     assert(isInf(math.inf(f32)));
     assert(isInf(-math.inf(f32)));
     assert(isInf(math.inf(f64)));
@@ -61,10 +75,14 @@ test "math.isInf" {
 }
 
 test "math.isPositiveInf" {
+    assert(!isPositiveInf(f16(0.0)));
+    assert(!isPositiveInf(f16(-0.0)));
     assert(!isPositiveInf(f32(0.0)));
     assert(!isPositiveInf(f32(-0.0)));
     assert(!isPositiveInf(f64(0.0)));
     assert(!isPositiveInf(f64(-0.0)));
+    assert(isPositiveInf(math.inf(f16)));
+    assert(!isPositiveInf(-math.inf(f16)));
     assert(isPositiveInf(math.inf(f32)));
     assert(!isPositiveInf(-math.inf(f32)));
     assert(isPositiveInf(math.inf(f64)));
@@ -72,10 +90,14 @@ test "math.isPositiveInf" {
 }
 
 test "math.isNegativeInf" {
+    assert(!isNegativeInf(f16(0.0)));
+    assert(!isNegativeInf(f16(-0.0)));
     assert(!isNegativeInf(f32(0.0)));
     assert(!isNegativeInf(f32(-0.0)));
     assert(!isNegativeInf(f64(0.0)));
     assert(!isNegativeInf(f64(-0.0)));
+    assert(!isNegativeInf(math.inf(f16)));
+    assert(isNegativeInf(-math.inf(f16)));
     assert(!isNegativeInf(math.inf(f32)));
     assert(isNegativeInf(-math.inf(f32)));
     assert(!isNegativeInf(math.inf(f64)));