use super::{F32Like, LikeF32};
use crate::double::NormDouble;
impl<F: F32Like> crate::generic::Gamma<LikeF32> for F {
#[inline]
fn lo_th() -> Self {
Self::cast_from(-1000i16)
}
#[inline]
fn hi_th() -> Self {
Self::cast_from(1000i16)
}
#[inline]
fn th_1() -> Self {
Self::from_raw(0x3F99999A) }
#[inline]
fn th_2() -> Self {
Self::from_raw(0x40133333) }
#[inline]
fn th_3() -> Self {
Self::from_raw(0x40E00000) }
const POLY_OFF: u8 = 3;
#[inline]
fn half_ln_2_pi() -> NormDouble<Self> {
const HALF_LN_2_PI_HI: u32 = 0x3F6B3F8E; const HALF_LN_2_PI_LO: u32 = 0x32864BEB;
NormDouble::with_parts(
Self::from_raw(HALF_LN_2_PI_HI),
Self::from_raw(HALF_LN_2_PI_LO),
)
}
#[inline]
fn lgamma_poly_1(x: Self) -> (Self, Self, Self, Self) {
const K1: u32 = 0xBF13C468; const K2: u32 = 0x3F528D34; const K3: u32 = 0xBECD2724; const K4: u32 = 0x3E8A8775; const K5: u32 = 0xBE541CDC; const K6: u32 = 0x3E2EF709; const K7: u32 = 0xBE18A740; const K8: u32 = 0x3DAD637B; const K9: u32 = 0xBE052FA3; const K10: u32 = 0x3EFA602D; const K11: u32 = 0x3F7C4B16; const K12: u32 = 0x3F85D08F;
let k1 = Self::from_raw(K1);
let k2 = Self::from_raw(K2);
let k3 = Self::from_raw(K3);
let k4 = Self::from_raw(K4);
let k5 = Self::from_raw(K5);
let k6 = Self::from_raw(K6);
let k7 = Self::from_raw(K7);
let k8 = Self::from_raw(K8);
let k9 = Self::from_raw(K9);
let k10 = Self::from_raw(K10);
let k11 = Self::from_raw(K11);
let k12 = Self::from_raw(K12);
let r = horner!(x, x, [k4, k5, k6, k7, k8, k9, k10, k11, k12]);
(r, k1, k2, k3)
}
#[inline]
fn lgamma_poly_2(x: Self) -> (Self, Self, Self, Self) {
const K1: u32 = 0x3ED87730; const K2: u32 = 0x3EA51A66; const K3: u32 = 0xBD89F004; const K4: u32 = 0x3CA89909; const K5: u32 = 0xBBF1FC4B; const K6: u32 = 0x3B3D8928; const K7: u32 = 0xBA9D5730; const K8: u32 = 0x39FCDFA6; const K9: u32 = 0xB96522B2; const K10: u32 = 0x3971F78E; const K11: u32 = 0x392E52A9; const K12: u32 = 0x391420D1;
let k1 = Self::from_raw(K1);
let k2 = Self::from_raw(K2);
let k3 = Self::from_raw(K3);
let k4 = Self::from_raw(K4);
let k5 = Self::from_raw(K5);
let k6 = Self::from_raw(K6);
let k7 = Self::from_raw(K7);
let k8 = Self::from_raw(K8);
let k9 = Self::from_raw(K9);
let k10 = Self::from_raw(K10);
let k11 = Self::from_raw(K11);
let k12 = Self::from_raw(K12);
let r = horner!(x, x, [k4, k5, k6, k7, k8, k9, k10, k11, k12]);
(r, k1, k2, k3)
}
#[inline]
fn special_poly(x: Self) -> Self {
const K0: u32 = 0x3DAAAAAB; const K1: u32 = 0x3B638E3A; const K2: u32 = 0xBB2FB999; const K3: u32 = 0xB96FF798; const K4: u32 = 0x3A4B562E; const K5: u32 = 0x390C9519; const K6: u32 = 0xBA68C85B; const K7: u32 = 0x3A43DE66; const K8: u32 = 0xB96EF373;
let k0 = Self::from_raw(K0);
let k1 = Self::from_raw(K1);
let k2 = Self::from_raw(K2);
let k3 = Self::from_raw(K3);
let k4 = Self::from_raw(K4);
let k5 = Self::from_raw(K5);
let k6 = Self::from_raw(K6);
let k7 = Self::from_raw(K7);
let k8 = Self::from_raw(K8);
k0 + horner!(x, x, [k1, k2, k3, k4, k5, k6, k7, k8])
}
}