@@ -4,6 +4,7 @@ use core::ops::{Add, Div, Neg};
44
55use core:: f32;
66use core:: f64;
7+ use std:: println;
78
89use crate :: { Num , NumCast , ToPrimitive } ;
910
@@ -2046,34 +2047,65 @@ macro_rules! float_impl_libm {
20462047 } ;
20472048}
20482049
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+ } ;
20622078
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+ }
20712084 } ;
2072- // Exponent bias + mantissa shift
2073- exponent -= 1023 + 52 ;
2074- ( mantissa, exponent, sign)
20752085}
20762086
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+
20772109#[ cfg( feature = "std" ) ]
20782110float_impl_std ! ( f32 integer_decode_f32) ;
20792111#[ cfg( feature = "std" ) ]
0 commit comments