@@ -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
@@ -2046,34 +2047,65 @@ macro_rules! float_impl_libm {
2046
2047
} ;
2047
2048
}
2048
2049
2049
- fn integer_decode_f32 ( f : f32 ) -> ( u64 , i16 , i8 ) {
2050
- let bits: u32 = f. to_bits ( ) ;
2051
- let sign: i8 = if bits >> 31 == 0 { 1 } else { -1 } ;
2052
- let mut exponent: i16 = ( ( bits >> 23 ) & 0xff ) as i16 ;
2053
- let mantissa = if exponent == 0 {
2054
- ( bits & 0x7fffff ) << 1
2055
- } else {
2056
- ( bits & 0x7fffff ) | 0x800000
2057
- } ;
2058
- // Exponent bias + mantissa shift
2059
- exponent -= 127 + 23 ;
2060
- ( mantissa as u64 , exponent, sign)
2061
- }
2050
+ macro_rules! integer_decode {
2051
+ (
2052
+ $func_name: ident,
2053
+ $T: ty,
2054
+ $sign_bit_index: expr,
2055
+ $fraction_bits_start_index: expr,
2056
+ $postshift_mask: expr,
2057
+ $fraction_bits_mask: expr,
2058
+ $exponent_trailing_bit_mask: expr,
2059
+ $exponent_bias: expr
2060
+ ) => {
2061
+ fn $func_name( f: $T) -> ( u64 , i16 , i8 ) {
2062
+ println!( " sign_bit_index: {}" , $sign_bit_index) ;
2063
+ println!( " fraction_bits_start_index: {}" , $fraction_bits_start_index) ;
2064
+ println!( " postshift_mask: {:064b}" , $postshift_mask) ;
2065
+ println!( " fraction_bits_mask: {:064b}" , $fraction_bits_mask) ;
2066
+ println!( "exponent_trailing_bit_mask: {:064b}" , $exponent_trailing_bit_mask) ;
2067
+ println!( " exponent_bias: {}" , $exponent_bias) ;
2068
+
2069
+ let bits = f. to_bits( ) ;
2070
+ println!( " bits: {:064b}" , bits) ;
2071
+
2072
+ let sign: i8 = if bits >> $sign_bit_index == 0 { 1 } else { -1 } ;
2073
+ let mantissa = if f == 0 as $T {
2074
+ ( bits & $fraction_bits_mask) << 1
2075
+ } else {
2076
+ ( bits & $fraction_bits_mask) | $exponent_trailing_bit_mask
2077
+ } ;
2062
2078
2063
- fn integer_decode_f64 ( f : f64 ) -> ( u64 , i16 , i8 ) {
2064
- let bits: u64 = f. to_bits ( ) ;
2065
- let sign: i8 = if bits >> 63 == 0 { 1 } else { -1 } ;
2066
- let mut exponent: i16 = ( ( bits >> 52 ) & 0x7ff ) as i16 ;
2067
- let mantissa = if exponent == 0 {
2068
- ( bits & 0xfffffffffffff ) << 1
2069
- } else {
2070
- ( bits & 0xfffffffffffff ) | 0x10000000000000
2079
+ let mut exponent: i16 = ( bits >> $fraction_bits_start_index & $postshift_mask) as i16 ;
2080
+ exponent -= $exponent_bias + $fraction_bits_start_index;
2081
+
2082
+ ( mantissa as u64 , exponent, sign)
2083
+ }
2071
2084
} ;
2072
- // Exponent bias + mantissa shift
2073
- exponent -= 1023 + 52 ;
2074
- ( mantissa, exponent, sign)
2075
2085
}
2076
2086
2087
+ integer_decode ! (
2088
+ integer_decode_f32,
2089
+ f32 ,
2090
+ 31 ,
2091
+ 23 ,
2092
+ 0xff ,
2093
+ 0x7fffff ,
2094
+ 0x800000 ,
2095
+ 127
2096
+ ) ;
2097
+
2098
+ integer_decode ! (
2099
+ integer_decode_f64,
2100
+ f64 ,
2101
+ 63 ,
2102
+ 52 ,
2103
+ 0x7ff ,
2104
+ 0xfffffffffffff_u64 ,
2105
+ 0x10000000000000_u64 ,
2106
+ 1023
2107
+ ) ;
2108
+
2077
2109
#[ cfg( feature = "std" ) ]
2078
2110
float_impl_std ! ( f32 integer_decode_f32) ;
2079
2111
#[ cfg( feature = "std" ) ]
0 commit comments