use super::{F64Like, LikeF64};
use crate::double::NormDouble;
impl<F: F64Like> crate::generic::Gamma<LikeF64> for F {
#[inline]
fn lo_th() -> Self {
Self::cast_from(-10000i16)
}
#[inline]
fn hi_th() -> Self {
Self::cast_from(10000i16)
}
#[inline]
fn th_1() -> Self {
Self::from_raw(0x3FF199999999999A) }
#[inline]
fn th_2() -> Self {
Self::from_raw(0x4002666666666666) }
#[inline]
fn th_3() -> Self {
Self::from_raw(0x401C000000000000) }
const POLY_OFF: u8 = 5;
#[inline]
fn half_ln_2_pi() -> NormDouble<Self> {
const HALF_LN_2_PI_HI: u64 = 0x3FED67F1C864BEB4; const HALF_LN_2_PI_LO: u64 = 0x3C94D252F2400510;
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: u64 = 0xBFE2788CFC6FB619; const K2: u64 = 0x3FEA51A6625307D3; const K3: u64 = 0xBFD9A4D55BEAB2C7; const K4: u64 = 0x3FD151322AC7D624; const K5: u64 = 0xBFCA8B9C17AACFE0; const K6: u64 = 0x3FC5B40CB105F2AD; const K7: u64 = 0xBFC2703A1D222293; const K8: u64 = 0x3FC010B36A674F5D; const K9: u64 = 0xBFBC806804DE7F45; const K10: u64 = 0x3FB9A0183CAEF329; const K11: u64 = 0xBFB7487ABA16AA7F; const K12: u64 = 0x3FB55AC4DCD8BE68; const K13: u64 = 0xBFB3AAB76DDCC2E6; const K14: u64 = 0x3FB17E9E8AAF70B5; const K15: u64 = 0xBFB8148C5EB43FC0; const K16: u64 = 0xBF4AB531D1CBB53F; const K17: u64 = 0x3FDD12C0C1A8FB64; const K18: u64 = 0x40165DFCA8F24959; const K19: u64 = 0x403B78CFF49C2C1E; const K20: u64 = 0x405658F7A41729C9; const K21: u64 = 0x406994530189D081; const K22: u64 = 0x407510762AE9660F; const K23: u64 = 0x40789675FCCB8053; const K24: u64 = 0x407377395F4EA94E; const K25: u64 = 0x4062DBDDB10987AB; const K26: u64 = 0x404117D92E3A43A7;
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 k13 = Self::from_raw(K13);
let k14 = Self::from_raw(K14);
let k15 = Self::from_raw(K15);
let k16 = Self::from_raw(K16);
let k17 = Self::from_raw(K17);
let k18 = Self::from_raw(K18);
let k19 = Self::from_raw(K19);
let k20 = Self::from_raw(K20);
let k21 = Self::from_raw(K21);
let k22 = Self::from_raw(K22);
let k23 = Self::from_raw(K23);
let k24 = Self::from_raw(K24);
let k25 = Self::from_raw(K25);
let k26 = Self::from_raw(K26);
let r = horner!(
x,
x,
[
k4, k5, k6, k7, k8, k9, k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k20, k21,
k22, k23, k24, k25, k26
]
);
(r, k1, k2, k3)
}
#[inline]
fn lgamma_poly_2(x: Self) -> (Self, Self, Self, Self) {
const K1: u64 = 0x3FDB0EE6072093CE; const K2: u64 = 0x3FD4A34CC4A60FA6; const K3: u64 = 0xBFB13E001A557607; const K4: u64 = 0x3F951322AC7D843A; const K5: u64 = 0xBF7E404FC218F57A; const K6: u64 = 0x3F67ADD6EADC34D2; const K7: u64 = 0xBF538AC5C2BD4F12; const K8: u64 = 0x3F40B36AF7DEDC08; const K9: u64 = 0xBF2D3FD4CD99ACA3; const K10: u64 = 0x3F1A127B67287811; const K11: u64 = 0xBF078DE263862A3F; const K12: u64 = 0x3EF580D20A43B0E4; const K13: u64 = 0xBEE3CCAFCE27C2A3; const K14: u64 = 0x3ED257F162658760; const K15: u64 = 0xBEC0FEBAD845E64A; const K16: u64 = 0x3EB0A769AB5E6EDE; const K17: u64 = 0xBE9F079F7E2B40B5; const K18: u64 = 0xBE5586C53F557385; const K19: u64 = 0xBEA0F68137677B0F; const K20: u64 = 0x3E7B1D0666DEFB91; const K21: u64 = 0x3EB6181175C86A69; const K22: u64 = 0x3EC5B2CD6B0C00D8; const K23: u64 = 0x3EC63140B7C8FE0E; const K24: u64 = 0x3EBB94EE67D692AD; const K25: u64 = 0x3EA39324890BEFA8; const K26: u64 = 0x3E797EF31705BA15;
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 k13 = Self::from_raw(K13);
let k14 = Self::from_raw(K14);
let k15 = Self::from_raw(K15);
let k16 = Self::from_raw(K16);
let k17 = Self::from_raw(K17);
let k18 = Self::from_raw(K18);
let k19 = Self::from_raw(K19);
let k20 = Self::from_raw(K20);
let k21 = Self::from_raw(K21);
let k22 = Self::from_raw(K22);
let k23 = Self::from_raw(K23);
let k24 = Self::from_raw(K24);
let k25 = Self::from_raw(K25);
let k26 = Self::from_raw(K26);
let r = horner!(
x,
x,
[
k4, k5, k6, k7, k8, k9, k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k20, k21,
k22, k23, k24, k25, k26
]
);
(r, k1, k2, k3)
}
#[inline]
fn special_poly(x: Self) -> Self {
const K0: u64 = 0x3FB5555555555555; const K1: u64 = 0x3F6C71C71C71C71D; const K2: u64 = 0xBF65F7268EDAB562; const K3: u64 = 0xBF2E13CE46596435; const K4: u64 = 0x3F49B0FF67EA3788; const K5: u64 = 0x3F12476133E14208; const K6: u64 = 0xBF436777EDF04343; const K7: u64 = 0xBF0B16B496C91C91; const K8: u64 = 0x3F4B7A31BED21A9D; const K9: u64 = 0x3F16813B38F7D790; const K10: u64 = 0xBF60F0E69E331F78; const K11: u64 = 0x3F5332A82C88CF38; const K12: u64 = 0xBF6608165FCD7932; const K13: u64 = 0x3FA90EE5D7B24D31; const K14: u64 = 0xBFCD1D6674C1002D; const K15: u64 = 0x3FE30A7D96B4D425; const K16: u64 = 0xBFF078B777C664BD; const K17: u64 = 0x3FF3492E51A7DFF0; const K18: u64 = 0xBFEC517B561AF98F; const K19: u64 = 0x3FD14A384A88C2EB; const K20: u64 = 0x3FC344A179080DDD; const K21: u64 = 0xBFC6DF751C10B452; const K22: u64 = 0x3FAB8C6B5443C33F;
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);
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 k13 = Self::from_raw(K13);
let k14 = Self::from_raw(K14);
let k15 = Self::from_raw(K15);
let k16 = Self::from_raw(K16);
let k17 = Self::from_raw(K17);
let k18 = Self::from_raw(K18);
let k19 = Self::from_raw(K19);
let k20 = Self::from_raw(K20);
let k21 = Self::from_raw(K21);
let k22 = Self::from_raw(K22);
k0 + horner!(
x,
x,
[
k1, k2, k3, k4, k5, k6, k7, k8, k9, k10, k11, k12, k13, k14, k15, k16, k17, k18,
k19, k20, k21, k22
]
)
}
}