@@ -489,6 +489,15 @@ impl f64 {
489
489
#[ stable( feature = "assoc_int_consts" , since = "1.43.0" ) ]
490
490
pub const NEG_INFINITY : f64 = -1.0_f64 / 0.0_f64 ;
491
491
492
+ /// Sign bit
493
+ pub ( crate ) const SIGN_MASK : u64 = 0x8000_0000_0000_0000 ;
494
+
495
+ /// Exponent mask
496
+ pub ( crate ) const EXP_MASK : u64 = 0x7ff0_0000_0000_0000 ;
497
+
498
+ /// Mantissa mask
499
+ pub ( crate ) const MAN_MASK : u64 = 0x000f_ffff_ffff_ffff ;
500
+
492
501
/// Returns `true` if this value is NaN.
493
502
///
494
503
/// ```
@@ -514,9 +523,7 @@ impl f64 {
514
523
#[ rustc_const_unstable( feature = "const_float_classify" , issue = "72505" ) ]
515
524
pub ( crate ) const fn abs_private ( self ) -> f64 {
516
525
// SAFETY: This transmutation is fine. Probably. For the reasons std is using it.
517
- unsafe {
518
- mem:: transmute :: < u64 , f64 > ( mem:: transmute :: < f64 , u64 > ( self ) & 0x7fff_ffff_ffff_ffff )
519
- }
526
+ unsafe { mem:: transmute :: < u64 , f64 > ( mem:: transmute :: < f64 , u64 > ( self ) & !Self :: SIGN_MASK ) }
520
527
}
521
528
522
529
/// Returns `true` if this value is positive infinity or negative infinity, and
@@ -673,13 +680,10 @@ impl f64 {
673
680
// and some normal floating point numbers truncated from an x87 FPU.
674
681
#[ rustc_const_unstable( feature = "const_float_classify" , issue = "72505" ) ]
675
682
const unsafe fn partial_classify ( self ) -> FpCategory {
676
- const EXP_MASK : u64 = 0x7ff0000000000000 ;
677
- const MAN_MASK : u64 = 0x000fffffffffffff ;
678
-
679
683
// SAFETY: The caller is not asking questions for which this will tell lies.
680
684
let b = unsafe { mem:: transmute :: < f64 , u64 > ( self ) } ;
681
- match ( b & MAN_MASK , b & EXP_MASK ) {
682
- ( 0 , EXP_MASK ) => FpCategory :: Infinite ,
685
+ match ( b & Self :: MAN_MASK , b & Self :: EXP_MASK ) {
686
+ ( 0 , Self :: EXP_MASK ) => FpCategory :: Infinite ,
683
687
( 0 , 0 ) => FpCategory :: Zero ,
684
688
( _, 0 ) => FpCategory :: Subnormal ,
685
689
_ => FpCategory :: Normal ,
@@ -691,12 +695,9 @@ impl f64 {
691
695
// plus a transmute. We do not live in a just world, but we can make it more so.
692
696
#[ rustc_const_unstable( feature = "const_float_classify" , issue = "72505" ) ]
693
697
const fn classify_bits ( b : u64 ) -> FpCategory {
694
- const EXP_MASK : u64 = 0x7ff0000000000000 ;
695
- const MAN_MASK : u64 = 0x000fffffffffffff ;
696
-
697
- match ( b & MAN_MASK , b & EXP_MASK ) {
698
- ( 0 , EXP_MASK ) => FpCategory :: Infinite ,
699
- ( _, EXP_MASK ) => FpCategory :: Nan ,
698
+ match ( b & Self :: MAN_MASK , b & Self :: EXP_MASK ) {
699
+ ( 0 , Self :: EXP_MASK ) => FpCategory :: Infinite ,
700
+ ( _, Self :: EXP_MASK ) => FpCategory :: Nan ,
700
701
( 0 , 0 ) => FpCategory :: Zero ,
701
702
( _, 0 ) => FpCategory :: Subnormal ,
702
703
_ => FpCategory :: Normal ,
@@ -756,7 +757,7 @@ impl f64 {
756
757
// IEEE754 says: isSignMinus(x) is true if and only if x has negative sign. isSignMinus
757
758
// applies to zeros and NaNs as well.
758
759
// SAFETY: This is just transmuting to get the sign bit, it's fine.
759
- unsafe { mem:: transmute :: < f64 , u64 > ( self ) & 0x8000_0000_0000_0000 != 0 }
760
+ unsafe { mem:: transmute :: < f64 , u64 > ( self ) & Self :: SIGN_MASK != 0 }
760
761
}
761
762
762
763
#[ must_use]
@@ -800,14 +801,13 @@ impl f64 {
800
801
// We must use strictly integer arithmetic to prevent denormals from
801
802
// flushing to zero after an arithmetic operation on some platforms.
802
803
const TINY_BITS : u64 = 0x1 ; // Smallest positive f64.
803
- const CLEAR_SIGN_MASK : u64 = 0x7fff_ffff_ffff_ffff ;
804
804
805
805
let bits = self . to_bits ( ) ;
806
806
if self . is_nan ( ) || bits == Self :: INFINITY . to_bits ( ) {
807
807
return self ;
808
808
}
809
809
810
- let abs = bits & CLEAR_SIGN_MASK ;
810
+ let abs = bits & ! Self :: SIGN_MASK ;
811
811
let next_bits = if abs == 0 {
812
812
TINY_BITS
813
813
} else if bits == abs {
@@ -850,14 +850,13 @@ impl f64 {
850
850
// We must use strictly integer arithmetic to prevent denormals from
851
851
// flushing to zero after an arithmetic operation on some platforms.
852
852
const NEG_TINY_BITS : u64 = 0x8000_0000_0000_0001 ; // Smallest (in magnitude) negative f64.
853
- const CLEAR_SIGN_MASK : u64 = 0x7fff_ffff_ffff_ffff ;
854
853
855
854
let bits = self . to_bits ( ) ;
856
855
if self . is_nan ( ) || bits == Self :: NEG_INFINITY . to_bits ( ) {
857
856
return self ;
858
857
}
859
858
860
- let abs = bits & CLEAR_SIGN_MASK ;
859
+ let abs = bits & ! Self :: SIGN_MASK ;
861
860
let next_bits = if abs == 0 {
862
861
NEG_TINY_BITS
863
862
} else if bits == abs {
0 commit comments