Skip to content

Commit 3c09565

Browse files
committed
Refactor functions integer_decode_f32 and integer_decode_f64 with new macro integer_decode\!
1 parent c3b277a commit 3c09565

File tree

1 file changed

+58
-28
lines changed

1 file changed

+58
-28
lines changed

src/float.rs

Lines changed: 58 additions & 28 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

@@ -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")]
20862116
float_impl_std!(f32 integer_decode_f32);
20872117
#[cfg(feature = "std")]

0 commit comments

Comments
 (0)