Skip to content

Commit 4cc9d0b

Browse files
committed
Add additional constants to primitive floating point numbers
These follow the values defined in the C99 standard
1 parent b7cf89f commit 4cc9d0b

File tree

4 files changed

+96
-1
lines changed

4 files changed

+96
-1
lines changed

src/libcore/num/f32.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,14 @@ impl Real for f32 {
508508
fn tanh(&self) -> f32 { tanh(*self) }
509509
}
510510

511+
impl Bounded for f32 {
512+
#[inline(always)]
513+
fn min_value() -> f32 { 1.17549435e-38 }
514+
515+
#[inline(always)]
516+
fn max_value() -> f32 { 3.40282347e+38 }
517+
}
518+
511519
impl Primitive for f32 {
512520
#[inline(always)]
513521
fn bits() -> uint { 32 }
@@ -532,6 +540,27 @@ impl Float for f32 {
532540
#[inline(always)]
533541
fn is_NaN(&self) -> bool { *self != *self }
534542

543+
#[inline(always)]
544+
fn mantissa_digits() -> uint { 24 }
545+
546+
#[inline(always)]
547+
fn digits() -> uint { 6 }
548+
549+
#[inline(always)]
550+
fn epsilon() -> f32 { 1.19209290e-07 }
551+
552+
#[inline(always)]
553+
fn min_exp() -> int { -125 }
554+
555+
#[inline(always)]
556+
fn max_exp() -> int { 128 }
557+
558+
#[inline(always)]
559+
fn min_10_exp() -> int { -37 }
560+
561+
#[inline(always)]
562+
fn max_10_exp() -> int { 38 }
563+
535564
/// Returns `true` if the number is infinite
536565
#[inline(always)]
537566
fn is_infinite(&self) -> bool {

src/libcore/num/f64.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,14 @@ impl RealExt for f64 {
548548
fn yn(&self, n: int) -> f64 { yn(n as c_int, *self) }
549549
}
550550

551+
impl Bounded for f64 {
552+
#[inline(always)]
553+
fn min_value() -> f64 { 2.2250738585072014e-308 }
554+
555+
#[inline(always)]
556+
fn max_value() -> f64 { 1.7976931348623157e+308 }
557+
}
558+
551559
impl Primitive for f64 {
552560
#[inline(always)]
553561
fn bits() -> uint { 64 }
@@ -584,6 +592,27 @@ impl Float for f64 {
584592
!(self.is_NaN() || self.is_infinite())
585593
}
586594

595+
#[inline(always)]
596+
fn mantissa_digits() -> uint { 53 }
597+
598+
#[inline(always)]
599+
fn digits() -> uint { 15 }
600+
601+
#[inline(always)]
602+
fn epsilon() -> f64 { 2.2204460492503131e-16 }
603+
604+
#[inline(always)]
605+
fn min_exp() -> int { -1021 }
606+
607+
#[inline(always)]
608+
fn max_exp() -> int { 1024 }
609+
610+
#[inline(always)]
611+
fn min_10_exp() -> int { -307 }
612+
613+
#[inline(always)]
614+
fn max_10_exp() -> int { 308 }
615+
587616
///
588617
/// Fused multiply-add. Computes `(self * a) + b` with only one rounding error. This
589618
/// produces a more accurate result with better performance than a separate multiplication

src/libcore/num/float.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -700,6 +700,14 @@ impl Signed for float {
700700
fn is_negative(&self) -> bool { *self < 0.0 || (1.0 / *self) == neg_infinity }
701701
}
702702
703+
impl Bounded for float {
704+
#[inline(always)]
705+
fn min_value() -> float { Bounded::min_value::<f64>() as float }
706+
707+
#[inline(always)]
708+
fn max_value() -> float { Bounded::max_value::<f64>() as float }
709+
}
710+
703711
impl Primitive for float {
704712
#[inline(always)]
705713
fn bits() -> uint { Primitive::bits::<f64>() }
@@ -724,6 +732,27 @@ impl Float for float {
724732
#[inline(always)]
725733
fn is_NaN(&self) -> bool { *self != *self }
726734
735+
#[inline(always)]
736+
fn mantissa_digits() -> uint { Float::mantissa_digits::<f64>() }
737+
738+
#[inline(always)]
739+
fn digits() -> uint { Float::digits::<f64>() }
740+
741+
#[inline(always)]
742+
fn epsilon() -> float { Float::epsilon::<f64>() as float }
743+
744+
#[inline(always)]
745+
fn min_exp() -> int { Float::min_exp::<f64>() }
746+
747+
#[inline(always)]
748+
fn max_exp() -> int { Float::max_exp::<f64>() }
749+
750+
#[inline(always)]
751+
fn min_10_exp() -> int { Float::min_10_exp::<f64>() }
752+
753+
#[inline(always)]
754+
fn max_10_exp() -> int { Float::max_10_exp::<f64>() }
755+
727756
/// Returns `true` if the number is infinite
728757
#[inline(always)]
729758
fn is_infinite(&self) -> bool {

src/libcore/num/num.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ pub trait Bounded {
219219
///
220220
pub trait Primitive: Num
221221
+ NumCast
222+
+ Bounded
222223
+ Neg<Self>
223224
+ Add<Self,Self>
224225
+ Sub<Self,Self>
@@ -235,7 +236,6 @@ pub trait Primitive: Num
235236
///
236237
pub trait Int: Integer
237238
+ Primitive
238-
+ Bounded
239239
+ Bitwise
240240
+ BitCount {}
241241

@@ -255,6 +255,14 @@ pub trait Float: Real
255255
fn is_infinite(&self) -> bool;
256256
fn is_finite(&self) -> bool;
257257

258+
fn mantissa_digits() -> uint;
259+
fn digits() -> uint;
260+
fn epsilon() -> Self;
261+
fn min_exp() -> int;
262+
fn max_exp() -> int;
263+
fn min_10_exp() -> int;
264+
fn max_10_exp() -> int;
265+
258266
fn mul_add(&self, a: Self, b: Self) -> Self;
259267
fn next_after(&self, other: Self) -> Self;
260268
}

0 commit comments

Comments
 (0)