@@ -4,6 +4,7 @@ use core::ops::{Add, Div, Neg};
4
4
5
5
use core:: f32;
6
6
use core:: f64;
7
+ use std:: println;
7
8
8
9
use crate :: { Num , NumCast , ToPrimitive } ;
9
10
@@ -2050,38 +2051,67 @@ macro_rules! float_impl_libm {
2050
2051
} ;
2051
2052
}
2052
2053
2053
- fn integer_decode_f32 ( f : f32 ) -> ( u64 , i16 , i8 ) {
2054
- let bits: u32 = f. to_bits ( ) ;
2055
- let sign: i8 = if bits >> 31 == 0 { 1 } else { -1 } ;
2056
- let mut exponent: i16 = ( ( bits >> 23 ) & 0xff ) as i16 ;
2057
- let mantissa = if exponent == 0 {
2058
- // Zeros and subnormals
2059
- ( bits & 0x7fffff ) << 1
2060
- } else {
2061
- // Normals, infinities, and NaN
2062
- ( bits & 0x7fffff ) | 0x800000
2063
- } ;
2064
- // Exponent bias + mantissa shift
2065
- exponent -= 127 + 23 ;
2066
- ( mantissa as u64 , exponent, sign)
2067
- }
2054
+ macro_rules! integer_decode {
2055
+ (
2056
+ $func_name: ident,
2057
+ $T: ty,
2058
+ $sign_bit_index: expr,
2059
+ $fraction_bits_start_index: expr,
2060
+ $postshift_mask: expr,
2061
+ $fraction_bits_mask: expr,
2062
+ $exponent_trailing_bit_mask: expr,
2063
+ $exponent_bias: expr
2064
+ ) => {
2065
+ fn $func_name( f: $T) -> ( u64 , i16 , i8 ) {
2066
+ println!( " sign_bit_index: {}" , $sign_bit_index) ;
2067
+ println!( " fraction_bits_start_index: {}" , $fraction_bits_start_index) ;
2068
+ println!( " postshift_mask: {:064b}" , $postshift_mask) ;
2069
+ println!( " fraction_bits_mask: {:064b}" , $fraction_bits_mask) ;
2070
+ println!( "exponent_trailing_bit_mask: {:064b}" , $exponent_trailing_bit_mask) ;
2071
+ println!( " exponent_bias: {}" , $exponent_bias) ;
2072
+
2073
+ let bits = f. to_bits( ) ;
2074
+ println!( " bits: {:064b}" , bits) ;
2075
+
2076
+ let sign: i8 = if bits >> $sign_bit_index == 0 { 1 } else { -1 } ;
2077
+ let mantissa = if f == 0 as $T {
2078
+ // Zeros and subnormals
2079
+ ( bits & $fraction_bits_mask) << 1
2080
+ } else {
2081
+ // Normals, infinities, and NaN
2082
+ ( bits & $fraction_bits_mask) | $exponent_trailing_bit_mask
2083
+ } ;
2068
2084
2069
- fn integer_decode_f64 ( f : f64 ) -> ( u64 , i16 , i8 ) {
2070
- let bits: u64 = f. to_bits ( ) ;
2071
- let sign: i8 = if bits >> 63 == 0 { 1 } else { -1 } ;
2072
- let mut exponent: i16 = ( ( bits >> 52 ) & 0x7ff ) as i16 ;
2073
- let mantissa = if exponent == 0 {
2074
- // Zeros and subnormals
2075
- ( bits & 0xfffffffffffff ) << 1
2076
- } else {
2077
- // Normals, infinities, and NaN
2078
- ( bits & 0xfffffffffffff ) | 0x10000000000000
2085
+ let mut exponent: i16 = ( bits >> $fraction_bits_start_index & $postshift_mask) as i16 ;
2086
+ exponent -= $exponent_bias + $fraction_bits_start_index;
2087
+
2088
+ ( mantissa as u64 , exponent, sign)
2089
+ }
2079
2090
} ;
2080
- // Exponent bias + mantissa shift
2081
- exponent -= 1023 + 52 ;
2082
- ( mantissa, exponent, sign)
2083
2091
}
2084
2092
2093
+ integer_decode ! (
2094
+ integer_decode_f32,
2095
+ f32 ,
2096
+ 31 ,
2097
+ 23 ,
2098
+ 0xff ,
2099
+ 0x7fffff ,
2100
+ 0x800000 ,
2101
+ 127
2102
+ ) ;
2103
+
2104
+ integer_decode ! (
2105
+ integer_decode_f64,
2106
+ f64 ,
2107
+ 63 ,
2108
+ 52 ,
2109
+ 0x7ff ,
2110
+ 0xfffffffffffff_u64 ,
2111
+ 0x10000000000000_u64 ,
2112
+ 1023
2113
+ ) ;
2114
+
2085
2115
#[ cfg( feature = "std" ) ]
2086
2116
float_impl_std ! ( f32 integer_decode_f32) ;
2087
2117
#[ cfg( feature = "std" ) ]
0 commit comments