| //! libm in pure Rust |
| #![deny(warnings)] |
| #![no_std] |
| #![cfg_attr(all(feature = "unstable"), feature(core_intrinsics))] |
| #![allow(clippy::unreadable_literal)] |
| #![allow(clippy::many_single_char_names)] |
| #![allow(clippy::needless_return)] |
| #![allow(clippy::int_plus_one)] |
| #![allow(clippy::deprecated_cfg_attr)] |
| #![allow(clippy::mixed_case_hex_literals)] |
| #![allow(clippy::float_cmp)] |
| #![allow(clippy::eq_op)] |
| #![allow(clippy::assign_op_pattern)] |
| |
| mod math; |
| |
| use core::{f32, f64}; |
| |
| pub use self::math::*; |
| |
| /// Approximate equality with 1 ULP of tolerance |
| #[doc(hidden)] |
| #[inline] |
| pub fn _eqf(a: f32, b: f32) -> Result<(), u32> { |
| if a.is_nan() && b.is_nan() { |
| Ok(()) |
| } else { |
| let err = (a.to_bits() as i32).wrapping_sub(b.to_bits() as i32).abs(); |
| |
| if err <= 1 { |
| Ok(()) |
| } else { |
| Err(err as u32) |
| } |
| } |
| } |
| |
| #[doc(hidden)] |
| #[inline] |
| pub fn _eq(a: f64, b: f64) -> Result<(), u64> { |
| if a.is_nan() && b.is_nan() { |
| Ok(()) |
| } else { |
| let err = (a.to_bits() as i64).wrapping_sub(b.to_bits() as i64).abs(); |
| |
| if err <= 1 { |
| Ok(()) |
| } else { |
| Err(err as u64) |
| } |
| } |
| } |
| |
| // PowerPC tests are failing on LLVM 13: https://github.com/rust-lang/rust/issues/88520 |
| #[cfg(not(target_arch = "powerpc64"))] |
| #[cfg(all(test, feature = "musl-reference-tests"))] |
| include!(concat!(env!("OUT_DIR"), "/musl-tests.rs")); |