| ... | @@ -3,19 +3,19 @@ const assert = std.debug.assert; | ... | @@ -3,19 +3,19 @@ const assert = std.debug.assert; |
| 3 | const expect = std.testing.expect; | 3 | const expect = std.testing.expect; |
| 4 | | 4 | |
| 5 | /// Creates a raw "1.0" mantissa for floating point type T. Used to dedupe f80 logic. | 5 | /// Creates a raw "1.0" mantissa for floating point type T. Used to dedupe f80 logic. |
| 6 | fn mantissaOne(comptime T: type) comptime_int { | 6 | inline fn mantissaOne(comptime T: type) comptime_int { |
| 7 | return if (@typeInfo(T).Float.bits == 80) 1 << floatFractionalBits(T) else 0; | 7 | return if (@typeInfo(T).Float.bits == 80) 1 << floatFractionalBits(T) else 0; |
| 8 | } | 8 | } |
| 9 | | 9 | |
| 10 | /// Creates floating point type T from an unbiased exponent and raw mantissa. | 10 | /// Creates floating point type T from an unbiased exponent and raw mantissa. |
| 11 | fn reconstructFloat(comptime T: type, exponent: comptime_int, mantissa: comptime_int) T { | 11 | inline fn reconstructFloat(comptime T: type, exponent: comptime_int, mantissa: comptime_int) T { |
| 12 | const TBits = std.meta.Int(.unsigned, @bitSizeOf(T)); | 12 | const TBits = std.meta.Int(.unsigned, @bitSizeOf(T)); |
| 13 | const biased_exponent = @as(TBits, exponent + floatExponentMax(T)); | 13 | const biased_exponent = @as(TBits, exponent + floatExponentMax(T)); |
| 14 | return @bitCast(T, (biased_exponent << floatMantissaBits(T)) | @as(TBits, mantissa)); | 14 | return @bitCast(T, (biased_exponent << floatMantissaBits(T)) | @as(TBits, mantissa)); |
| 15 | } | 15 | } |
| 16 | | 16 | |
| 17 | /// Returns the number of bits in the exponent of floating point type T. | 17 | /// Returns the number of bits in the exponent of floating point type T. |
| 18 | pub fn floatExponentBits(comptime T: type) comptime_int { | 18 | pub inline fn floatExponentBits(comptime T: type) comptime_int { |
| 19 | assert(@typeInfo(T) == .Float); | 19 | assert(@typeInfo(T) == .Float); |
| 20 | | 20 | |
| 21 | return switch (@typeInfo(T).Float.bits) { | 21 | return switch (@typeInfo(T).Float.bits) { |
| ... | @@ -29,7 +29,7 @@ pub fn floatExponentBits(comptime T: type) comptime_int { | ... | @@ -29,7 +29,7 @@ pub fn floatExponentBits(comptime T: type) comptime_int { |
| 29 | } | 29 | } |
| 30 | | 30 | |
| 31 | /// Returns the number of bits in the mantissa of floating point type T. | 31 | /// Returns the number of bits in the mantissa of floating point type T. |
| 32 | pub fn floatMantissaBits(comptime T: type) comptime_int { | 32 | pub inline fn floatMantissaBits(comptime T: type) comptime_int { |
| 33 | assert(@typeInfo(T) == .Float); | 33 | assert(@typeInfo(T) == .Float); |
| 34 | | 34 | |
| 35 | return switch (@typeInfo(T).Float.bits) { | 35 | return switch (@typeInfo(T).Float.bits) { |
| ... | @@ -43,7 +43,7 @@ pub fn floatMantissaBits(comptime T: type) comptime_int { | ... | @@ -43,7 +43,7 @@ pub fn floatMantissaBits(comptime T: type) comptime_int { |
| 43 | } | 43 | } |
| 44 | | 44 | |
| 45 | /// Returns the number of fractional bits in the mantissa of floating point type T. | 45 | /// Returns the number of fractional bits in the mantissa of floating point type T. |
| 46 | pub fn floatFractionalBits(comptime T: type) comptime_int { | 46 | pub inline fn floatFractionalBits(comptime T: type) comptime_int { |
| 47 | assert(@typeInfo(T) == .Float); | 47 | assert(@typeInfo(T) == .Float); |
| 48 | | 48 | |
| 49 | // standard IEEE floats have an implicit 0.m or 1.m integer part | 49 | // standard IEEE floats have an implicit 0.m or 1.m integer part |
| ... | @@ -61,39 +61,39 @@ pub fn floatFractionalBits(comptime T: type) comptime_int { | ... | @@ -61,39 +61,39 @@ pub fn floatFractionalBits(comptime T: type) comptime_int { |
| 61 | | 61 | |
| 62 | /// Returns the minimum exponent that can represent | 62 | /// Returns the minimum exponent that can represent |
| 63 | /// a normalised value in floating point type T. | 63 | /// a normalised value in floating point type T. |
| 64 | pub fn floatExponentMin(comptime T: type) comptime_int { | 64 | pub inline fn floatExponentMin(comptime T: type) comptime_int { |
| 65 | return -floatExponentMax(T) + 1; | 65 | return -floatExponentMax(T) + 1; |
| 66 | } | 66 | } |
| 67 | | 67 | |
| 68 | /// Returns the maximum exponent that can represent | 68 | /// Returns the maximum exponent that can represent |
| 69 | /// a normalised value in floating point type T. | 69 | /// a normalised value in floating point type T. |
| 70 | pub fn floatExponentMax(comptime T: type) comptime_int { | 70 | pub inline fn floatExponentMax(comptime T: type) comptime_int { |
| 71 | return (1 << (floatExponentBits(T) - 1)) - 1; | 71 | return (1 << (floatExponentBits(T) - 1)) - 1; |
| 72 | } | 72 | } |
| 73 | | 73 | |
| 74 | /// Returns the smallest subnormal number representable in floating point type T. | 74 | /// Returns the smallest subnormal number representable in floating point type T. |
| 75 | pub fn floatTrueMin(comptime T: type) T { | 75 | pub inline fn floatTrueMin(comptime T: type) T { |
| 76 | return reconstructFloat(T, floatExponentMin(T) - 1, 1); | 76 | return reconstructFloat(T, floatExponentMin(T) - 1, 1); |
| 77 | } | 77 | } |
| 78 | | 78 | |
| 79 | /// Returns the smallest normal number representable in floating point type T. | 79 | /// Returns the smallest normal number representable in floating point type T. |
| 80 | pub fn floatMin(comptime T: type) T { | 80 | pub inline fn floatMin(comptime T: type) T { |
| 81 | return reconstructFloat(T, floatExponentMin(T), mantissaOne(T)); | 81 | return reconstructFloat(T, floatExponentMin(T), mantissaOne(T)); |
| 82 | } | 82 | } |
| 83 | | 83 | |
| 84 | /// Returns the largest normal number representable in floating point type T. | 84 | /// Returns the largest normal number representable in floating point type T. |
| 85 | pub fn floatMax(comptime T: type) T { | 85 | pub inline fn floatMax(comptime T: type) T { |
| 86 | const all1s_mantissa = (1 << floatMantissaBits(T)) - 1; | 86 | const all1s_mantissa = (1 << floatMantissaBits(T)) - 1; |
| 87 | return reconstructFloat(T, floatExponentMax(T), all1s_mantissa); | 87 | return reconstructFloat(T, floatExponentMax(T), all1s_mantissa); |
| 88 | } | 88 | } |
| 89 | | 89 | |
| 90 | /// Returns the machine epsilon of floating point type T. | 90 | /// Returns the machine epsilon of floating point type T. |
| 91 | pub fn floatEps(comptime T: type) T { | 91 | pub inline fn floatEps(comptime T: type) T { |
| 92 | return reconstructFloat(T, -floatFractionalBits(T), mantissaOne(T)); | 92 | return reconstructFloat(T, -floatFractionalBits(T), mantissaOne(T)); |
| 93 | } | 93 | } |
| 94 | | 94 | |
| 95 | /// Returns the value inf for floating point type T. | 95 | /// Returns the value inf for floating point type T. |
| 96 | pub fn inf(comptime T: type) T { | 96 | pub inline fn inf(comptime T: type) T { |
| 97 | return reconstructFloat(T, floatExponentMax(T) + 1, mantissaOne(T)); | 97 | return reconstructFloat(T, floatExponentMax(T) + 1, mantissaOne(T)); |
| 98 | } | 98 | } |
| 99 | | 99 | |