use strafe_type::{FloatConstraint, LogProbability64, Positive64, Probability64, Real64};
use crate::traits::DPQ;
pub fn qexp<PR: Into<Probability64>, PO: Into<Positive64>>(
p: PR,
scale: PO,
lower_tail: bool,
) -> Real64 {
qexp_inner(p.into().unwrap(), scale, lower_tail, false)
}
pub fn log_qexp<LP: Into<LogProbability64>, PO: Into<Positive64>>(
p: LP,
scale: PO,
lower_tail: bool,
) -> Real64 {
qexp_inner(p.into().unwrap(), scale, lower_tail, true)
}
fn qexp_inner<P: Into<Positive64>>(p: f64, scale: P, lower_tail: bool, log: bool) -> Real64 {
if p == f64::dt_0(lower_tail, log) {
return 0.0.into();
}
(-scale.into().unwrap() * p.dt_clog(lower_tail, log)).into()
}