use crate::intrinsics as raw;
mod private {
pub trait Sealed {}
impl Sealed for f32 {}
impl Sealed for f64 {}
}
pub trait FloatExt: Sized + private::Sealed {
fn cospi(self) -> Self;
fn error_function(self) -> Self;
fn complementary_error_function(self) -> Self;
fn inv_complementary_error_function(self) -> Self;
fn scaled_complementary_error_function(self) -> Self;
fn frexp(self) -> (Self, i32);
fn unbiased_exp(self) -> i32;
fn j0(self) -> Self;
fn j1(self) -> Self;
fn jn(self, order: i32) -> Self;
fn ldexp(self, exp: i32) -> Self;
fn log_gamma(self) -> Self;
fn log1p(self) -> Self;
fn norm_cdf(self) -> Self;
fn inv_norm_cdf(self) -> Self;
fn rcbrt(self) -> Self;
fn saturate(self) -> Self;
fn scale_by_n(self, exp: i32) -> Self;
fn sincospi(self) -> (Self, Self);
fn sinpi(self) -> Self;
fn gamma(self) -> Self;
fn y0(self) -> Self;
fn y1(self) -> Self;
fn yn(self, order: i32) -> Self;
}
impl FloatExt for f64 {
fn cospi(self) -> Self {
unsafe { raw::cospi(self) }
}
fn error_function(self) -> Self {
unsafe { raw::erf(self) }
}
fn complementary_error_function(self) -> Self {
unsafe { raw::erfc(self) }
}
fn inv_complementary_error_function(self) -> Self {
unsafe { raw::erfcinv(self) }
}
fn scaled_complementary_error_function(self) -> Self {
unsafe { raw::erfcx(self) }
}
fn frexp(self) -> (Self, i32) {
let mut exp = 0;
unsafe {
let fract = raw::frexp(self, &mut exp as *mut i32);
(fract, exp)
}
}
fn unbiased_exp(self) -> i32 {
unsafe { raw::ilogb(self) }
}
fn j0(self) -> Self {
unsafe { raw::j0(self) }
}
fn j1(self) -> Self {
unsafe { raw::j1(self) }
}
fn jn(self, order: i32) -> Self {
unsafe { raw::jn(order, self) }
}
fn ldexp(self, exp: i32) -> Self {
unsafe { raw::ldexp(self, exp) }
}
fn log_gamma(self) -> Self {
unsafe { raw::lgamma(self) }
}
fn log1p(self) -> Self {
unsafe { raw::log1p(self) }
}
fn norm_cdf(self) -> Self {
unsafe { raw::normcdf(self) }
}
fn inv_norm_cdf(self) -> Self {
unsafe { raw::normcdfinv(self) }
}
fn rcbrt(self) -> Self {
unsafe { raw::rcbrt(self) }
}
fn saturate(self) -> Self {
self.clamp(0.0, 1.0)
}
fn scale_by_n(self, exp: i32) -> Self {
unsafe { raw::scalbn(self, exp) }
}
fn sincospi(self) -> (Self, Self) {
let mut sin = 0.0;
let mut cos = 0.0;
unsafe {
raw::sincospi(self, &mut sin as *mut f64, &mut cos as *mut f64);
}
(sin, cos)
}
fn sinpi(self) -> Self {
unsafe { raw::sinpi(self) }
}
fn gamma(self) -> Self {
unsafe { raw::tgamma(self) }
}
fn y0(self) -> Self {
unsafe { raw::y0(self) }
}
fn y1(self) -> Self {
unsafe { raw::y1(self) }
}
fn yn(self, order: i32) -> Self {
unsafe { raw::yn(order, self) }
}
}
impl FloatExt for f32 {
fn cospi(self) -> Self {
unsafe { raw::cospif(self) }
}
fn error_function(self) -> Self {
unsafe { raw::erff(self) }
}
fn complementary_error_function(self) -> Self {
unsafe { raw::erfcf(self) }
}
fn inv_complementary_error_function(self) -> Self {
unsafe { raw::erfcinvf(self) }
}
fn scaled_complementary_error_function(self) -> Self {
unsafe { raw::erfcxf(self) }
}
fn frexp(self) -> (Self, i32) {
let mut exp = 0;
unsafe {
let fract = raw::frexpf(self, &mut exp as *mut i32);
(fract, exp)
}
}
fn unbiased_exp(self) -> i32 {
unsafe { raw::ilogbf(self) }
}
fn j0(self) -> Self {
unsafe { raw::j0f(self) }
}
fn j1(self) -> Self {
unsafe { raw::j1f(self) }
}
fn jn(self, order: i32) -> Self {
unsafe { raw::jnf(order, self) }
}
fn ldexp(self, exp: i32) -> Self {
unsafe { raw::ldexpf(self, exp) }
}
fn log_gamma(self) -> Self {
unsafe { raw::lgammaf(self) }
}
fn log1p(self) -> Self {
unsafe { raw::log1pf(self) }
}
fn norm_cdf(self) -> Self {
unsafe { raw::normcdff(self) }
}
fn inv_norm_cdf(self) -> Self {
unsafe { raw::normcdfinvf(self) }
}
fn rcbrt(self) -> Self {
unsafe { raw::rcbrtf(self) }
}
fn saturate(self) -> Self {
unsafe { raw::saturatef(self) }
}
fn scale_by_n(self, exp: i32) -> Self {
unsafe { raw::scalbnf(self, exp) }
}
fn sincospi(self) -> (Self, Self) {
let mut sin = 0.0;
let mut cos = 0.0;
unsafe {
raw::sincospif(self, &mut sin as *mut f32, &mut cos as *mut f32);
}
(sin, cos)
}
fn sinpi(self) -> Self {
unsafe { raw::sinpif(self) }
}
fn gamma(self) -> Self {
unsafe { raw::tgammaf(self) }
}
fn y0(self) -> Self {
unsafe { raw::y0f(self) }
}
fn y1(self) -> Self {
unsafe { raw::y1f(self) }
}
fn yn(self, order: i32) -> Self {
unsafe { raw::ynf(order, self) }
}
}