pub fn is_int(x: f64) -> bool {
let mut e = (x.to_bits() >> 52 & 0x7FF) - 0x3FF + 12;
if e >= 52 + 12 {
return true;
}
if e < 12 {
e = 1;
}
let m = u64::MAX >> e;
if x.to_bits() & m == 0 {
return true;
}
x.to_bits() & !m == x.to_bits()
}
#[cfg(not(feature = "std"))]
#[allow(unused)]
macro_rules! is_x86_feature_detected {
($feature:expr) => {
cfg!(all(target_arch = "x86_64", target_feature = $feature))
};
}
#[cfg(not(feature = "std"))]
#[allow(unused)]
macro_rules! is_aarch64_feature_detected {
($feature:expr) => {
cfg!(all(target_arch = "aarch64", target_feature = $feature))
};
}
#[cfg(not(feature = "std"))]
#[allow(unused)]
pub(crate) use {is_aarch64_feature_detected, is_x86_feature_detected};
#[rustfmt::skip] #[cfg(feature = "std")]
#[allow(unused)]
pub use std::arch::{is_aarch64_feature_detected, is_x86_feature_detected};
#[cfg(test)]
mod tests {
use core::f64;
use super::is_int;
#[test]
fn test_is_int() {
assert!(is_int(1.));
assert!(is_int(-496.));
assert!(!is_int(1.5));
assert!(is_int(9007199254740991.));
assert!(!is_int(f64::consts::PI));
}
}