1
Fork 0

Add gamma and ln_gamma functions to f32 and f64

This commit is contained in:
Andrew Kane 2023-07-31 07:41:50 -07:00
parent a17c7968b7
commit fcecaff16e
7 changed files with 158 additions and 1 deletions

View file

@ -957,4 +957,46 @@ impl f64 {
pub fn atanh(self) -> f64 {
0.5 * ((2.0 * self) / (1.0 - self)).ln_1p()
}
/// Gamma function.
///
/// # Examples
///
/// ```
/// #![feature(float_gamma)]
/// let x = 5.0f64;
///
/// let abs_difference = (x.gamma() - 24.0).abs();
///
/// assert!(abs_difference <= f64::EPSILON);
/// ```
#[rustc_allow_incoherent_impl]
#[must_use = "method returns a new number and does not mutate the original value"]
#[unstable(feature = "float_gamma", issue = "99842")]
#[inline]
pub fn gamma(self) -> f64 {
unsafe { cmath::tgamma(self) }
}
/// Returns the natural logarithm of the gamma function.
///
/// # Examples
///
/// ```
/// #![feature(float_gamma)]
/// let x = 2.0f64;
///
/// let abs_difference = (x.ln_gamma().0 - 0.0).abs();
///
/// assert!(abs_difference <= f64::EPSILON);
/// ```
#[rustc_allow_incoherent_impl]
#[must_use = "method returns a new number and does not mutate the original value"]
#[unstable(feature = "float_gamma", issue = "99842")]
#[inline]
pub fn ln_gamma(self) -> (f64, i32) {
let mut signgamp: i32 = 0;
let x = unsafe { cmath::lgamma_r(self, &mut signgamp) };
(x, signgamp)
}
}