Skip to content

Commit d7f94e5

Browse files
committed
Refactor functions integer_decode_f32 and integer_decode_f64 with new macro integer_decode\!
1 parent 25eb45f commit d7f94e5

File tree

1 file changed

+56
-24
lines changed

1 file changed

+56
-24
lines changed

src/float.rs

Lines changed: 56 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use core::ops::{Add, Div, Neg};
44

55
use core::f32;
66
use core::f64;
7+
use std::println;
78

89
use 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")]
20782110
float_impl_std!(f32 integer_decode_f32);
20792111
#[cfg(feature = "std")]

0 commit comments

Comments
 (0)