From 4cc9d0ba7e454730988f318aeed92ab5e5ff8269 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sat, 27 Apr 2013 09:07:40 +1000 Subject: [PATCH] Add additional constants to primitive floating point numbers These follow the values defined in the C99 standard --- src/libcore/num/f32.rs | 29 +++++++++++++++++++++++++++++ src/libcore/num/f64.rs | 29 +++++++++++++++++++++++++++++ src/libcore/num/float.rs | 29 +++++++++++++++++++++++++++++ src/libcore/num/num.rs | 10 +++++++++- 4 files changed, 96 insertions(+), 1 deletion(-) diff --git a/src/libcore/num/f32.rs b/src/libcore/num/f32.rs index cae26349af1..bc067369bdb 100644 --- a/src/libcore/num/f32.rs +++ b/src/libcore/num/f32.rs @@ -508,6 +508,14 @@ impl Real for f32 { fn tanh(&self) -> f32 { tanh(*self) } } +impl Bounded for f32 { + #[inline(always)] + fn min_value() -> f32 { 1.17549435e-38 } + + #[inline(always)] + fn max_value() -> f32 { 3.40282347e+38 } +} + impl Primitive for f32 { #[inline(always)] fn bits() -> uint { 32 } @@ -532,6 +540,27 @@ impl Float for f32 { #[inline(always)] fn is_NaN(&self) -> bool { *self != *self } + #[inline(always)] + fn mantissa_digits() -> uint { 24 } + + #[inline(always)] + fn digits() -> uint { 6 } + + #[inline(always)] + fn epsilon() -> f32 { 1.19209290e-07 } + + #[inline(always)] + fn min_exp() -> int { -125 } + + #[inline(always)] + fn max_exp() -> int { 128 } + + #[inline(always)] + fn min_10_exp() -> int { -37 } + + #[inline(always)] + fn max_10_exp() -> int { 38 } + /// Returns `true` if the number is infinite #[inline(always)] fn is_infinite(&self) -> bool { diff --git a/src/libcore/num/f64.rs b/src/libcore/num/f64.rs index d5b423edb29..2a9f1cb3350 100644 --- a/src/libcore/num/f64.rs +++ b/src/libcore/num/f64.rs @@ -548,6 +548,14 @@ impl RealExt for f64 { fn yn(&self, n: int) -> f64 { yn(n as c_int, *self) } } +impl Bounded for f64 { + #[inline(always)] + fn min_value() -> f64 { 2.2250738585072014e-308 } + + #[inline(always)] + fn max_value() -> f64 { 1.7976931348623157e+308 } +} + impl Primitive for f64 { #[inline(always)] fn bits() -> uint { 64 } @@ -584,6 +592,27 @@ impl Float for f64 { !(self.is_NaN() || self.is_infinite()) } + #[inline(always)] + fn mantissa_digits() -> uint { 53 } + + #[inline(always)] + fn digits() -> uint { 15 } + + #[inline(always)] + fn epsilon() -> f64 { 2.2204460492503131e-16 } + + #[inline(always)] + fn min_exp() -> int { -1021 } + + #[inline(always)] + fn max_exp() -> int { 1024 } + + #[inline(always)] + fn min_10_exp() -> int { -307 } + + #[inline(always)] + fn max_10_exp() -> int { 308 } + /// /// Fused multiply-add. Computes `(self * a) + b` with only one rounding error. This /// produces a more accurate result with better performance than a separate multiplication diff --git a/src/libcore/num/float.rs b/src/libcore/num/float.rs index 4ba5b005490..55f12817026 100644 --- a/src/libcore/num/float.rs +++ b/src/libcore/num/float.rs @@ -700,6 +700,14 @@ impl Signed for float { fn is_negative(&self) -> bool { *self < 0.0 || (1.0 / *self) == neg_infinity } } +impl Bounded for float { + #[inline(always)] + fn min_value() -> float { Bounded::min_value::() as float } + + #[inline(always)] + fn max_value() -> float { Bounded::max_value::() as float } +} + impl Primitive for float { #[inline(always)] fn bits() -> uint { Primitive::bits::() } @@ -724,6 +732,27 @@ impl Float for float { #[inline(always)] fn is_NaN(&self) -> bool { *self != *self } + #[inline(always)] + fn mantissa_digits() -> uint { Float::mantissa_digits::() } + + #[inline(always)] + fn digits() -> uint { Float::digits::() } + + #[inline(always)] + fn epsilon() -> float { Float::epsilon::() as float } + + #[inline(always)] + fn min_exp() -> int { Float::min_exp::() } + + #[inline(always)] + fn max_exp() -> int { Float::max_exp::() } + + #[inline(always)] + fn min_10_exp() -> int { Float::min_10_exp::() } + + #[inline(always)] + fn max_10_exp() -> int { Float::max_10_exp::() } + /// Returns `true` if the number is infinite #[inline(always)] fn is_infinite(&self) -> bool { diff --git a/src/libcore/num/num.rs b/src/libcore/num/num.rs index 7da6107a0fb..0e2669a26b6 100644 --- a/src/libcore/num/num.rs +++ b/src/libcore/num/num.rs @@ -219,6 +219,7 @@ pub trait Bounded { /// pub trait Primitive: Num + NumCast + + Bounded + Neg + Add + Sub @@ -235,7 +236,6 @@ pub trait Primitive: Num /// pub trait Int: Integer + Primitive - + Bounded + Bitwise + BitCount {} @@ -255,6 +255,14 @@ pub trait Float: Real fn is_infinite(&self) -> bool; fn is_finite(&self) -> bool; + fn mantissa_digits() -> uint; + fn digits() -> uint; + fn epsilon() -> Self; + fn min_exp() -> int; + fn max_exp() -> int; + fn min_10_exp() -> int; + fn max_10_exp() -> int; + fn mul_add(&self, a: Self, b: Self) -> Self; fn next_after(&self, other: Self) -> Self; }