use crate::libc::*;
use crate::nmath::*;
use crate::pgamma::log1pmx;
use crate::rmath::*;
use libm::frexp;
use libm::ldexp;
pub fn bd0(x: f64, np: f64) -> f64 {
if !r_finite(x) || !r_finite(np) || np == 0.0 {
return ml_warn_return_nan();
}
if fabs(x - np) < 0.1 * (x + np) {
let mut v: f64 = (x - np) / (x + np);
let mut s: f64 = (x - np) * v;
if fabs(s) < DBL_MIN {
return s;
}
let mut ej: f64 = 2.0 * x * v;
v *= v; for j in 1..1000 {
ej *= v;
let s_: f64 = s;
s += ej / ((j << 1) + 1) as f64;
if s == s_ {
return s;
}
}
}
println!("bd0: T.series failed to converge in 1000 iterations");
x * log(x / np) + np - x
}
#[allow(clippy::approx_constant)]
const BD0_SCALE: [[f32; 4]; 129] = [
[
0.693_147_2,
-1.904_654_2e-9,
-8.783_184e-17,
3.061_840_7e-24,
],
[
0.685_304_05,
-4.257_826_4e-8,
-1.172_310_5e-15,
6.203_392_6e-23,
],
[0.677_398_8, 2.274_189e-8, 1.441_192e-15, 7.046_384_5e-23],
[
0.669_930_6,
-4.829_385_6e-8,
-8.664_795_5e-16,
7.049_558e-24,
],
[
0.662_406_1,
-4.791_602_5e-8,
-2.161_508_2e-15,
7.092_968_4e-23,
],
[0.654_824_5, 6.237_715_2e-9, 1.180_67e-16, 6.660_323_5e-25],
[
0.647_185_1,
-4.220_867e-8,
-1.381_758_9e-15,
-1.115_993_24e-23,
],
[0.640_001_9, -4.979_17e-8, 4.887_014e-16, 1.684_746_6e-23],
[
0.632_766_7,
-5.406_177_2e-8,
-2.722_454_5e-15,
-2.907_078e-23,
],
[0.624_956_13, 3.285_935_4e-8, 1.201_673e-16, -8.668_233e-24],
[
0.618_137_36,
-6.406_189_5e-11,
3.550_581e-18,
-3.623_679_4e-25,
],
[0.610_741_6, 4.229_853_8e-8, 1.548_143_3e-15, -5.446_353e-23],
[
0.603_290_8,
5.515_817_5e-8,
2.119_363_7e-15,
1.247_109_8e-22,
],
[0.596_322_2, 3.281_353_9e-9, -1.403_347e-16, 5.544_062e-24],
[
0.589_304_57,
4.307_998_6e-8,
-3.244_665_2e-15,
-2.569_782_4e-23,
],
[0.582_237_5, -3.983_067_4e-8, 2.938_790_6e-15, 1.612_443e-22],
[0.575_12, 2.242_384e-9, -2.204_516_4e-17, 4.078_543_8e-25],
[0.568_504_7, 4.422_870_6e-8, 2.787_995_7e-16, -9.741_709e-24],
[
0.561_845_4,
2.147_161_4e-8,
1.337_491_9e-15,
-2.326_922_3e-23,
],
[0.554_580_8, 4.577_835e-9, 2.633_146e-16, 2.070_995_9e-23],
[0.547_827_84, -7.668e-9, 6.199_095_3e-16, 6.341_979e-24],
[0.541_029, -3.730_232e-8, -3.380_178_1e-15, 1.446_919_8e-22],
[0.534_755_7, 4.382_892e-8, -8.601_821e-16, -8.775_950_6e-24],
[0.527_867_1, 1.083_971_5e-8, -4.480_281e-16, 3.884_099_6e-23],
[0.521_510_5, 4.203_159_4e-8, 1.211_01e-15, -2.320_674_5e-23],
[
0.514_529_7,
-1.232_294_1e-8,
2.820_084_5e-16,
1.880_026_6e-23,
],
[
0.508_087_5,
-1.229_712_7e-8,
-4.295_835_6e-16,
-1.803_662_6e-23,
],
[0.501_603_5, 5.914_538e-8, 1.272_856_1e-15, -5.824_094_4e-23],
[
0.495_077_25,
1.440_985_1e-8,
-6.381_91e-17,
-3.500_509_4e-25,
],
[
0.489_107_07,
2.745_798_6e-8,
-1.447_041_9e-15,
4.211_867e-23,
],
[
0.482_498_47,
1.762_245_5e-8,
4.128_675_2e-16,
2.608_269_2e-23,
],
[
0.476_452_53,
-1.247_024_35e-8,
-9.162_194e-17,
3.765_782_5e-24,
],
[0.469_759_46, -5.450_354e-9, -4.304_847e-16, 2.074_710_3e-25],
[
0.463_635_74,
-1.701_304_7e-9,
7.601_623e-18,
-2.041_587_9e-25,
],
[
0.457_474_3,
6.943_684_5e-10,
-2.546_131e-17,
5.541_253_3e-25,
],
[0.451_274_63, 1.073_186_5e-8, 6.374e-16, 3.901_547_3e-23],
[
0.445_036_3,
2.865_065_7e-8,
-9.155_353e-16,
-4.736_587_8e-23,
],
[
0.439_388_33,
2.618_613_2e-8,
1.361_960_2e-15,
-5.267_279_5e-23,
],
[
0.433_075_2,
1.906_573_4e-8,
1.014_319_2e-15,
1.014_567_1e-22,
],
[
0.427_359_1,
-1.141_359_4e-8,
1.324_204_5e-16,
-1.024_005_6e-23,
],
[
0.420_969_3,
-1.277_850_9e-8,
6.143_525_7e-16,
1.419_242_2e-23,
],
[0.415_183_37, -7.767_916e-9, 5.955_443e-16, 2.732_668e-23],
[
0.409_363_75,
1.880_755e-9,
1.915_333_1e-16,
-5.620_806_3e-24,
],
[0.403_510_1, -2.041_660_4e-8, -2.934_05e-16, 1.894_347e-24],
[0.397_621_93, 1.001_600_1e-9, 2.286_324_2e-17, 9.458_134e-25],
[
0.391_698_9,
1.545_909_7e-8,
1.096_282_3e-15,
3.108_302_2e-23,
],
[
0.386_404_4,
-2.076_412_4e-9,
1.507_346_5e-16,
7.412_449_5e-24,
],
[
0.380_414_37,
-8.244_395e-9,
1.486_622_5e-16,
-3.927_292_7e-24,
],
[0.374_388_22, 9.158_53e-9, 5.656_919e-16, 3.421_347_5e-23],
[
0.369_001_03,
-2.225_359_1e-8,
6.231_405_4e-16,
-2.156_475_1e-23,
],
[
0.363_584_64,
-2.677_872_9e-8,
-9.943_908e-16,
-4.704_929_7e-24,
],
[
0.357_455_9,
-2.033_036_1e-8,
-1.579_449_2e-15,
6.318_678e-23,
],
[0.351_976_4, 2.850_385_9e-8, -9.566_435e-16, -6.409_595e-24],
[
0.346_466_78,
-1.236_265_3e-8,
-6.003_368e-16,
-2.860_901_5e-24,
],
[
0.340_926_6,
-6.110_413_3e-10,
1.746_713_6e-17,
1.996_258_7e-25,
],
[
0.335_355_52,
2.167_272_6e-8,
-1.091_877_3e-15,
-3.047_574_8e-23,
],
[0.330_455_3, -1.608_884e-8, -3.833_435e-16, -7.683_742e-24],
[
0.324_825_4,
2.801_670_4e-8,
-2.072_572_1e-16,
1.316_077_8e-23,
],
[0.319_163_68, 2.622_263e-8, -1.399_522_3e-15, 8.599_884e-23],
[
0.314_183_24,
2.682_662_6e-8,
-9.792_556e-16,
2.295_496_1e-23,
],
[
0.308_460_77,
1.368_350_9e-8,
5.591_995e-16,
-1.193_870_14e-23,
],
[0.303_426_62, -8.629_042e-9, -5.222_554e-16, 3.228_770_8e-23],
[
0.298_366_96,
8.688_424e-9,
2.764_116_8e-16,
-1.017_185_9e-23,
],
[
0.292_553,
-4.916_314_5e-9,
2.562_284_7e-16,
-2.634_157_6e-23,
],
[
0.287_437_92,
-1.378_239_6e-8,
7.290_393_5e-16,
-4.431_978e-24,
],
[0.282_296_48, 2.377_086_6e-8, 6.449_228_4e-16, 3.417_537e-23],
[0.277_128_52, 1.473_302_9e-8, 6.793_364e-16, 3.593_898e-24],
[0.271_933_73, -1.893_332e-8, 7.779_394e-16, 2.591_972_4e-23],
[
0.266_711_77,
1.430_038_7e-11,
-7.458_877e-19,
4.247_418_8e-26,
],
[0.262_214, 7.802_219e-9, 5.022_431e-16, -2.406_317_5e-23],
[0.256_940_9, 2.961_805e-8, 7.279_528e-16, 2.638_556_1e-23],
[0.251_639_9, -6.447_878e-9, 4.122_028_1e-16, 7.427_559e-24],
[0.247_073_68, -1.998_183e-9, -1.090_975_8e-16, 6.236_552e-24],
[0.241_719_93, 5.523_086e-9, -2.686_547_6e-16, -2.764_496e-24],
[
0.237_108_08,
1.008_537_4e-8,
-4.775_627e-16,
2.330_620_6e-23,
],
[
0.231_700_6,
-1.394_638_4e-8,
1.097_092_1e-17,
3.229_909_4e-25,
],
[
0.227_042_2,
-6.451_285e-9,
-4.252_994_8e-16,
-1.026_025_5e-23,
],
[0.222_361_98, 1.411_064_5e-8, 6.025_569e-16, 1.938_518e-23],
[0.217_659_8, -8.286_783e-9, 5.232_364e-16, 5.078_443_5e-23],
[0.212_145_8, -8.254_219e-9, 3.255_553_1e-16, 1.571_43e-23],
[0.207_395_2, -1.614_928e-9, 2.113_159_3e-17, 1.427_561_7e-24],
[0.202_621_9, 8.597_64e-9, -3.380_462e-16, 2.562_323_6e-24],
[
0.197_825_73,
1.348_296_6e-8,
-3.202_457e-16,
-2.571_225_2e-23,
],
[
0.193_006_46,
9.956_86e-10,
9.001_674_6e-17,
-3.754_797_7e-24,
],
[
0.188_972_56,
4.241_536e-9,
3.808_681_5e-16,
-2.114_740_3e-23,
],
[
0.184_110_31,
6.931_055e-9,
-3.478_485_9e-16,
2.466_594_3e-23,
],
[
0.179_224_31,
5.073_923_5e-9,
3.222_133e-16,
-1.037_900_9e-23,
],
[0.174_314_32, 3.794_385_3e-9, 3.190_067e-16, 2.029_271_5e-23],
[
0.170_204_16,
3.422_334_4e-9,
-1.884_641_7e-16,
1.141_531_5e-23,
],
[
0.165_249_59,
-1.321_003_9e-8,
-2.321_395_4e-16,
3.043_054_2e-24,
],
[0.160_270_3, 6.007_922e-9, -7.521_048e-17, -1.264_910_6e-25],
[
0.156_101_91,
-1.230_153_6e-8,
3.017_561_8e-16,
-8.633_806_5e-24,
],
[
0.151_916_06,
-1.484_557_2e-8,
-3.265_830_3e-16,
-1.526_815_2e-23,
],
[
0.146_869_78,
-4.674_899_6e-9,
-4.294_291_3e-16,
1.328_296e-23,
],
[0.142_645, 9.186_472e-9, -8.049_373e-16, 1.437_998_8e-23],
[0.138_402_31, 9.865_117e-9, -8.837_306_5e-16, 7.295_325e-24],
[0.133_287_22, 9.990_351e-10, 3.316_946_6e-17, 2.735_144e-24],
[
0.129_004_57,
-7.461_208_5e-9,
-6.212_113e-16,
1.855_187_3e-24,
],
[
0.124_703_48,
-3.292_446_3e-9,
-7.404_12e-17,
1.324_695_6e-24,
],
[
0.120_383_814,
3.379_199_1e-9,
1.621_498_2e-16,
-6.000_706_7e-24,
],
[
0.116_045_415,
3.563_839_2e-10,
-7.354_22e-18,
7.794_312_4e-26,
],
[0.111_688_11, 3.136_766e-9, -8.994_406e-19, -7.920_937_6e-26],
[0.107_311_74, -4.728_528e-9, -4.297_634e-16, 5.351_143_3e-24],
[
0.102_916_12,
2.833_200_8e-9,
4.925_742_8e-17,
2.794_436_8e-24,
],
[0.098_501_1, 4.970_725e-9, 4.130_512_8e-16, 6.313_449_6e-25],
[
0.094_066_516,
-6.525_851e-9,
-1.349_281_7e-16,
-9.079_65e-24,
],
[
0.089_612_156,
2.536_961_8e-9,
1.611_066_5e-16,
-5.189_504_5e-24,
],
[
0.086_034_34,
-5.304_795_7e-9,
5.127_575_5e-17,
1.463_615_5e-24,
],
[
0.081_543_98,
2.011_215_6e-9,
8.065_769_3e-17,
-3.015_032e-24,
],
[0.077_033_37, 5.749_566e-9, -2.503_851e-16, -1.846_143_1e-23],
[
0.072_502_33,
1.177_662_6e-9,
-3.525_477e-17,
1.316_407_8e-24,
],
[
0.068_862_66,
-7.043_545_3e-9,
2.497_124e-16,
1.068_688_25e-23,
],
[0.064_294_35, -2.422_082e-9, -2.055_589_6e-16, 8.602_908e-24],
[
0.060_624_62,
7.905_943e-12,
-8.270_443_3e-19,
-2.353_382_1e-26,
],
[
0.056_018_442,
-5.139_745_3e-10,
-3.811_651_6e-17,
1.907_219_5e-24,
],
[
0.052_318_163,
-3.557_432_6e-9,
9.191_156e-17,
-5.321_464e-24,
],
[
0.047_673_47,
-1.802_634_9e-9,
1.032_963_4e-16,
-2.228_357e-24,
],
[
0.043_942_124,
-1.795_005_7e-9,
-5.381_740_3e-17,
-1.399_619_7e-24,
],
[0.040_196_8, 3.845_193e-10, -2.448_545_3e-17, -7.386_769e-26],
[
0.035_495_333,
-3.590_165_4e-10,
-2.073_207_8e-17,
-2.412_097_2e-26,
],
[
0.031_718_18,
6.872_350_5e-10,
-6.430_478e-18,
1.350_869_2e-25,
],
[
0.027_926_706,
7.568_773_4e-10,
-4.220_316e-17,
2.534_760_6e-24,
],
[
0.024_120_804,
-1.125_570_7e-9,
4.897_006e-17,
1.417_221_5e-24,
],
[
0.019_342_963,
1.906_861e-10,
-1.063_594_6e-17,
-5.300_489_5e-25,
],
[
0.015_504_187,
-4.370_104_8e-10,
6.611_061_5e-18,
2.539_808_7e-25,
],
[
0.011_650_616,
9.168_89e-10,
-1.584_869_8e-17,
-1.350_491_6e-24,
],
[
0.007_782_140_7,
-3.046_577_4e-10,
7.793_436e-18,
4.660_1e-25,
],
[
0.003_898_640_6,
-2.132_467_8e-10,
1.254_165_8e-19,
8.745_035_4e-27,
],
[0.0, 0.0, 0.0, 0.0],
];
fn add1(d: f64, yh: &mut f64, yl: &mut f64) {
let d1: f64 = (d + 0.5).floor();
let d2: f64 = d - d1; *yh += d1;
*yl += d2;
}
pub fn ebd0(x: f64, m: f64) -> (f64, f64) {
let sb: i32 = 10;
let s: f64 = 1024.0;
let n: i32 = 128;
let mut yh = 0.0;
let mut yl = 0.0;
if x == m {
return (yh, yl);
}
if x == 0.0 {
yh = m;
return (yh, yl);
}
if m == 0.0 {
yh = ML_POSINF;
return (yh, yl);
}
if m / x == ML_POSINF {
yh = m;
return (yh, yl);
}
let (r, e): (f64, i32) = frexp(m / x);
if M_LN2 * (-e as f64) > 1.0 + DBL_MAX / x {
yh = ML_POSINF;
return (yh, yl);
}
let i: i32 = ((r - 0.5) * (2 * n) as f64 + 0.5).floor() as i32;
let f: f64 = (s / (0.5 + (i as f64) / (2.0 * (n as f64))) + 0.5).floor();
let fg: f64 = ldexp(f, -(e + sb));
if fg == ML_POSINF {
yh = fg;
return (yh, yl);
}
add1(-x * log1pmx((m * fg - x) / x), &mut yh, &mut yl);
if fg == 1.0 {
return (yh, yl);
}
for j in 0..4 {
add1(x * BD0_SCALE[i as usize][j] as f64, &mut yh, &mut yl);
add1(-x * (BD0_SCALE[0][j] * e as f32) as f64, &mut yh, &mut yl);
if !r_finite(yh) {
yh = ML_POSINF;
yl = 0.0;
return (yh, yl);
}
}
add1(m, &mut yh, &mut yl);
add1(-m * fg, &mut yh, &mut yl);
(yh, yl)
}