add std.math f16 inf support

refs #1122
master
Ben Noordhuis 2018-06-30 01:44:54 +02:00
parent 27b02413dc
commit a36d7b6131
3 changed files with 26 additions and 1 deletions

View File

@ -28,6 +28,9 @@ pub const f16_toint = 1.0 / f16_epsilon;
pub const nan_u16 = u16(0x7C01); pub const nan_u16 = u16(0x7C01);
pub const nan_f16 = @bitCast(f16, nan_u16); 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_u32 = u32(0x7F800001);
pub const nan_f32 = @bitCast(f32, nan_u32); pub const nan_f32 = @bitCast(f32, nan_u32);

View File

@ -1,9 +1,9 @@
const std = @import("../index.zig"); const std = @import("../index.zig");
const math = std.math; const math = std.math;
const assert = std.debug.assert;
pub fn inf(comptime T: type) T { pub fn inf(comptime T: type) T {
return switch (T) { return switch (T) {
f16 => @bitCast(f16, math.inf_u16),
f32 => @bitCast(f32, math.inf_u32), f32 => @bitCast(f32, math.inf_u32),
f64 => @bitCast(f64, math.inf_u64), f64 => @bitCast(f64, math.inf_u64),
else => @compileError("inf not implemented for " ++ @typeName(T)), else => @compileError("inf not implemented for " ++ @typeName(T)),

View File

@ -5,6 +5,10 @@ const assert = std.debug.assert;
pub fn isInf(x: var) bool { pub fn isInf(x: var) bool {
const T = @typeOf(x); const T = @typeOf(x);
switch (T) { switch (T) {
f16 => {
const bits = @bitCast(u16, x);
return bits & 0x7FFF == 0x7C00;
},
f32 => { f32 => {
const bits = @bitCast(u32, x); const bits = @bitCast(u32, x);
return bits & 0x7FFFFFFF == 0x7F800000; return bits & 0x7FFFFFFF == 0x7F800000;
@ -22,6 +26,9 @@ pub fn isInf(x: var) bool {
pub fn isPositiveInf(x: var) bool { pub fn isPositiveInf(x: var) bool {
const T = @typeOf(x); const T = @typeOf(x);
switch (T) { switch (T) {
f16 => {
return @bitCast(u16, x) == 0x7C00;
},
f32 => { f32 => {
return @bitCast(u32, x) == 0x7F800000; return @bitCast(u32, x) == 0x7F800000;
}, },
@ -37,6 +44,9 @@ pub fn isPositiveInf(x: var) bool {
pub fn isNegativeInf(x: var) bool { pub fn isNegativeInf(x: var) bool {
const T = @typeOf(x); const T = @typeOf(x);
switch (T) { switch (T) {
f16 => {
return @bitCast(u16, x) == 0xFC00;
},
f32 => { f32 => {
return @bitCast(u32, x) == 0xFF800000; return @bitCast(u32, x) == 0xFF800000;
}, },
@ -50,10 +60,14 @@ pub fn isNegativeInf(x: var) bool {
} }
test "math.isInf" { 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(f32(-0.0))); assert(!isInf(f32(-0.0)));
assert(!isInf(f64(0.0))); assert(!isInf(f64(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(f32))); assert(isInf(-math.inf(f32)));
assert(isInf(math.inf(f64))); assert(isInf(math.inf(f64)));
@ -61,10 +75,14 @@ test "math.isInf" {
} }
test "math.isPositiveInf" { 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(f32(-0.0))); assert(!isPositiveInf(f32(-0.0)));
assert(!isPositiveInf(f64(0.0))); assert(!isPositiveInf(f64(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(f32))); assert(!isPositiveInf(-math.inf(f32)));
assert(isPositiveInf(math.inf(f64))); assert(isPositiveInf(math.inf(f64)));
@ -72,10 +90,14 @@ test "math.isPositiveInf" {
} }
test "math.isNegativeInf" { 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(f32(-0.0))); assert(!isNegativeInf(f32(-0.0)));
assert(!isNegativeInf(f64(0.0))); assert(!isNegativeInf(f64(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(f32))); assert(isNegativeInf(-math.inf(f32)));
assert(!isNegativeInf(math.inf(f64))); assert(!isNegativeInf(math.inf(f64)));