parent
27b02413dc
commit
a36d7b6131
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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)),
|
||||||
|
|
|
@ -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)));
|
||||||
|
|
Loading…
Reference in New Issue