Skip to content

Commit

Permalink
Rollup merge of rust-lang#99747 - ankane:float_gamma, r=joshtriplett
Browse files Browse the repository at this point in the history
Add gamma function to f32 and f64

Adds the [gamma function](https://en.wikipedia.org/wiki/Gamma_function) to `f32` and `f64` (`tgamma` and `tgammaf` from C).

Refs:
- rust-lang/rfcs#864
- rust-lang#18271
  • Loading branch information
Dylan-DPC authored Jul 28, 2022
2 parents 5996733 + 7d2e763 commit 042d69a
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 0 deletions.
20 changes: 20 additions & 0 deletions library/std/src/f32.rs
Original file line number Diff line number Diff line change
Expand Up @@ -920,4 +920,24 @@ impl f32 {
pub fn atanh(self) -> f32 {
0.5 * ((2.0 * self) / (1.0 - self)).ln_1p()
}

/// Gamma function.
///
/// # Examples
///
/// ```
/// #![feature(float_gamma)]
/// let x = 5.0f32;
///
/// let abs_difference = (x.gamma() - 24.0).abs();
///
/// assert!(abs_difference <= f32::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) -> f32 {
unsafe { cmath::tgammaf(self) }
}
}
15 changes: 15 additions & 0 deletions library/std/src/f32/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,21 @@ fn test_atanh() {
assert_approx_eq!((-0.5f32).atanh(), -0.54930614433405484569762261846126285f32);
}

#[test]
fn test_gamma() {
assert_eq!(0.0f32.gamma(), f32::INFINITY);
assert_approx_eq!(1.0f32.gamma(), 1.0f32);
assert_approx_eq!(2.0f32.gamma(), 1.0f32);
assert_approx_eq!(3.0f32.gamma(), 2.0f32);
assert_approx_eq!(4.0f32.gamma(), 6.0f32);
assert_approx_eq!(5.0f32.gamma(), 24.0f32);

assert_approx_eq!(0.5f32.gamma(), consts::PI.sqrt());
assert_approx_eq!((-0.5f32).gamma(), -2.0 * consts::PI.sqrt());

assert!((-1.0f32).gamma().is_nan());
}

#[test]
fn test_real_consts() {
use super::consts;
Expand Down
20 changes: 20 additions & 0 deletions library/std/src/f64.rs
Original file line number Diff line number Diff line change
Expand Up @@ -946,4 +946,24 @@ impl f64 {
Self::NAN // log(-Inf) = NaN
}
}

/// 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) }
}
}
15 changes: 15 additions & 0 deletions library/std/src/f64/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,21 @@ fn test_atanh() {
assert_approx_eq!((-0.5f64).atanh(), -0.54930614433405484569762261846126285f64);
}

#[test]
fn test_gamma() {
assert_eq!(0.0f64.gamma(), f64::INFINITY);
assert_approx_eq!(1.0f64.gamma(), 1.0f64);
assert_approx_eq!(2.0f64.gamma(), 1.0f64);
assert_approx_eq!(3.0f64.gamma(), 2.0f64);
assert_approx_eq!(4.0f64.gamma(), 6.0f64);
assert_approx_eq!(5.0f64.gamma(), 24.0f64);

assert_approx_eq!(0.5f64.gamma(), consts::PI.sqrt());
assert_approx_eq!((-0.5f64).gamma(), -2.0 * consts::PI.sqrt());

assert!((-1.0f64).gamma().is_nan());
}

#[test]
fn test_real_consts() {
use super::consts;
Expand Down
1 change: 1 addition & 0 deletions library/std/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,7 @@
#![feature(exact_size_is_empty)]
#![feature(exclusive_wrapper)]
#![feature(extend_one)]
#![feature(float_gamma)]
#![feature(float_minimum_maximum)]
#![feature(hasher_prefixfree_extras)]
#![feature(hashmap_internals)]
Expand Down
2 changes: 2 additions & 0 deletions library/std/src/sys/unix/cmath.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,6 @@ extern "C" {
pub fn tanf(n: f32) -> f32;
pub fn tanh(n: f64) -> f64;
pub fn tanhf(n: f32) -> f32;
pub fn tgamma(n: f64) -> f64;
pub fn tgammaf(n: f32) -> f32;
}
2 changes: 2 additions & 0 deletions library/std/src/sys/windows/cmath.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ extern "C" {
pub fn sinh(n: c_double) -> c_double;
pub fn tan(n: c_double) -> c_double;
pub fn tanh(n: c_double) -> c_double;
pub fn tgamma(n: c_double) -> c_double;
pub fn tgammaf(n: c_float) -> c_float;
}

pub use self::shims::*;
Expand Down

0 comments on commit 042d69a

Please sign in to comment.