@@ -1146,16 +1146,26 @@ impl f64 {
1146
1146
///
1147
1147
/// Note that this function is distinct from casting.
1148
1148
///
1149
+ /// Returns `Err(())` if the representation of a signaling NaN "sNaN"
1150
+ /// float, is passed to the function.
1151
+ ///
1149
1152
/// ```
1150
1153
/// #![feature(float_bits_conv)]
1151
1154
/// use std::f64;
1152
- /// let difference = (f64::from_bits(0x4029000000000000) - 12.5).abs();
1155
+ /// let v = f64::from_bits(0x4029000000000000).unwrap();
1156
+ /// let difference = (v - 12.5).abs();
1153
1157
/// assert!(difference <= 1e-5);
1158
+ /// // Example for a signaling NaN value:
1159
+ /// assert_eq!(f64::from_bits(0x7FF0000000000001), Err(()));
1154
1160
/// ```
1155
1161
#[ unstable( feature = "float_bits_conv" , reason = "recently added" , issue = "0" ) ]
1156
1162
#[ inline]
1157
- pub fn from_bits ( v : u64 ) -> Self {
1158
- unsafe { :: mem:: transmute ( v) }
1163
+ pub fn from_bits ( v : u64 ) -> Result < Self , ( ) > {
1164
+ match v {
1165
+ 0x7FF0000000000001 ... 0x7FF7FFFFFFFFFFFF |
1166
+ 0xFFF0000000000001 ... 0xFFF7FFFFFFFFFFFF => Err ( ( ) ) ,
1167
+ _ => Ok ( unsafe { :: mem:: transmute ( v) } ) ,
1168
+ }
1159
1169
}
1160
1170
}
1161
1171
@@ -1801,9 +1811,9 @@ mod tests {
1801
1811
assert_eq ! ( ( 12.5f64 ) . to_bits( ) , 0x4029000000000000 ) ;
1802
1812
assert_eq ! ( ( 1337f64 ) . to_bits( ) , 0x4094e40000000000 ) ;
1803
1813
assert_eq ! ( ( -14.25f64 ) . to_bits( ) , 0xc02c800000000000 ) ;
1804
- assert_approx_eq ! ( f64 :: from_bits( 0x3ff0000000000000 ) , 1.0 ) ;
1805
- assert_approx_eq ! ( f64 :: from_bits( 0x4029000000000000 ) , 12.5 ) ;
1806
- assert_approx_eq ! ( f64 :: from_bits( 0x4094e40000000000 ) , 1337.0 ) ;
1807
- assert_approx_eq ! ( f64 :: from_bits( 0xc02c800000000000 ) , -14.25 ) ;
1814
+ assert_approx_eq ! ( f64 :: from_bits( 0x3ff0000000000000 ) . unwrap ( ) , 1.0 ) ;
1815
+ assert_approx_eq ! ( f64 :: from_bits( 0x4029000000000000 ) . unwrap ( ) , 12.5 ) ;
1816
+ assert_approx_eq ! ( f64 :: from_bits( 0x4094e40000000000 ) . unwrap ( ) , 1337.0 ) ;
1817
+ assert_approx_eq ! ( f64 :: from_bits( 0xc02c800000000000 ) . unwrap ( ) , -14.25 ) ;
1808
1818
}
1809
1819
}
0 commit comments