use core::intrinsics::{ fadd_fast as add, fdiv_fast as div, fmul_fast as mul, frem_fast as rem, fsub_fast as sub, }; macro_rules! meth { ($($name:ident)|+) => { pub trait FastFloat: Copy + core::fmt::Display + core::fmt::Debug + core::ops::Neg + core::cmp::PartialEq + core::cmp::PartialOrd { $(#[doc(hidden)] unsafe fn $name(a: Self, b: Self) -> Self;)+ #[doc(hidden)] fn bad(self) -> bool; } impl FastFloat for f32 { $(#[inline(always)] unsafe fn $name(a: Self, b: Self) -> Self { $name(a, b) })+ #[inline(always)] fn bad(self) -> bool { self.is_nan() || self.is_infinite() } } impl FastFloat for f64 { $(#[inline(always)] unsafe fn $name(a: Self, b: Self) -> Self { $name(a, b) })+ #[inline(always)] fn bad(self) -> bool { self.is_nan() || self.is_infinite() } } }; } meth!(add | sub | div | mul | rem);