@@ -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
@@ -2050,38 +2051,67 @@ macro_rules! float_impl_libm {
20502051 } ;
20512052}
20522053
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+ } ;
20682084
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+ }
20792090 } ;
2080- // Exponent bias + mantissa shift
2081- exponent -= 1023 + 52 ;
2082- ( mantissa, exponent, sign)
20832091}
20842092
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+
20852115#[ cfg( feature = "std" ) ]
20862116float_impl_std ! ( f32 integer_decode_f32) ;
20872117#[ cfg( feature = "std" ) ]
0 commit comments