change tests to use fixed constants to let them pass with miri
This commit is contained in:
parent
5bafe9d8fc
commit
00452bd783
7 changed files with 44 additions and 77 deletions
|
|
@ -1879,7 +1879,7 @@ pub mod math {
|
|||
///
|
||||
/// let x = 2.0_f32;
|
||||
/// let abs_difference = (f32::math::powi(x, 2) - (x * x)).abs();
|
||||
/// assert!(abs_difference <= f32::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-5);
|
||||
///
|
||||
/// assert_eq!(f32::math::powi(f32::NAN, 0), 1.0);
|
||||
/// ```
|
||||
|
|
|
|||
|
|
@ -1877,7 +1877,7 @@ pub mod math {
|
|||
///
|
||||
/// let x = 2.0_f64;
|
||||
/// let abs_difference = (f64::math::powi(x, 2) - (x * x)).abs();
|
||||
/// assert!(abs_difference <= f64::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-6);
|
||||
///
|
||||
/// assert_eq!(f64::math::powi(f64::NAN, 0), 1.0);
|
||||
/// ```
|
||||
|
|
|
|||
|
|
@ -23,6 +23,11 @@ const NAN_MASK1: u32 = 0x002a_aaaa;
|
|||
/// Second pattern over the mantissa
|
||||
const NAN_MASK2: u32 = 0x0055_5555;
|
||||
|
||||
/// Miri adds some extra errors to float functions; make sure the tests still pass.
|
||||
/// These values are purely used as a canary to test against and are thus not a stable guarantee Rust provides.
|
||||
/// They serve as a way to get an idea of the real precision of floating point operations on different platforms.
|
||||
const APPROX_DELTA: f32 = if cfg!(miri) { 1e-4 } else { 1e-6 };
|
||||
|
||||
#[test]
|
||||
fn test_num_f32() {
|
||||
super::test_num(10f32, 2f32);
|
||||
|
|
@ -437,8 +442,8 @@ fn test_powi() {
|
|||
let nan: f32 = f32::NAN;
|
||||
let inf: f32 = f32::INFINITY;
|
||||
let neg_inf: f32 = f32::NEG_INFINITY;
|
||||
assert_biteq!(1.0f32.powi(1), 1.0);
|
||||
assert_approx_eq!((-3.1f32).powi(2), 9.61);
|
||||
assert_approx_eq!(1.0f32.powi(1), 1.0);
|
||||
assert_approx_eq!((-3.1f32).powi(2), 9.61, APPROX_DELTA);
|
||||
assert_approx_eq!(5.9f32.powi(-2), 0.028727);
|
||||
assert_biteq!(8.3f32.powi(0), 1.0);
|
||||
assert!(nan.powi(2).is_nan());
|
||||
|
|
|
|||
|
|
@ -304,7 +304,7 @@ impl f32 {
|
|||
/// ```
|
||||
/// let x = 2.0_f32;
|
||||
/// let abs_difference = (x.powi(2) - (x * x)).abs();
|
||||
/// assert!(abs_difference <= 8.0 * f32::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-5);
|
||||
///
|
||||
/// assert_eq!(f32::powi(f32::NAN, 0), 1.0);
|
||||
/// ```
|
||||
|
|
@ -328,7 +328,7 @@ impl f32 {
|
|||
/// ```
|
||||
/// let x = 2.0_f32;
|
||||
/// let abs_difference = (x.powf(2.0) - (x * x)).abs();
|
||||
/// assert!(abs_difference <= 8.0 * f32::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-5);
|
||||
///
|
||||
/// assert_eq!(f32::powf(1.0, f32::NAN), 1.0);
|
||||
/// assert_eq!(f32::powf(f32::NAN, 0.0), 1.0);
|
||||
|
|
@ -388,7 +388,7 @@ impl f32 {
|
|||
/// // ln(e) - 1 == 0
|
||||
/// let abs_difference = (e.ln() - 1.0).abs();
|
||||
///
|
||||
/// assert!(abs_difference <= 4.0 * f32::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-6);
|
||||
/// ```
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
|
|
@ -413,7 +413,7 @@ impl f32 {
|
|||
/// // 2^2 - 4 == 0
|
||||
/// let abs_difference = (f.exp2() - 4.0).abs();
|
||||
///
|
||||
/// assert!(abs_difference <= 8.0 * f32::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-5);
|
||||
/// ```
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
|
|
@ -442,7 +442,7 @@ impl f32 {
|
|||
/// // ln(e) - 1 == 0
|
||||
/// let abs_difference = (e.ln() - 1.0).abs();
|
||||
///
|
||||
/// assert!(abs_difference <= 4.0 * f32::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-6);
|
||||
/// ```
|
||||
///
|
||||
/// Non-positive values:
|
||||
|
|
@ -479,7 +479,7 @@ impl f32 {
|
|||
/// // log5(5) - 1 == 0
|
||||
/// let abs_difference = (five.log(5.0) - 1.0).abs();
|
||||
///
|
||||
/// assert!(abs_difference <= 4.0 * f32::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-6);
|
||||
/// ```
|
||||
///
|
||||
/// Non-positive values:
|
||||
|
|
@ -512,7 +512,7 @@ impl f32 {
|
|||
/// // log2(2) - 1 == 0
|
||||
/// let abs_difference = (two.log2() - 1.0).abs();
|
||||
///
|
||||
/// assert!(abs_difference <= 4.0 * f32::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-6);
|
||||
/// ```
|
||||
///
|
||||
/// Non-positive values:
|
||||
|
|
@ -545,7 +545,7 @@ impl f32 {
|
|||
/// // log10(10) - 1 == 0
|
||||
/// let abs_difference = (ten.log10() - 1.0).abs();
|
||||
///
|
||||
/// assert!(abs_difference <= 4.0 * f32::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-6);
|
||||
/// ```
|
||||
///
|
||||
/// Non-positive values:
|
||||
|
|
@ -652,7 +652,7 @@ impl f32 {
|
|||
/// // sqrt(x^2 + y^2)
|
||||
/// let abs_difference = (x.hypot(y) - (x.powi(2) + y.powi(2)).sqrt()).abs();
|
||||
///
|
||||
/// assert!(abs_difference <= 4.0 * f32::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-6);
|
||||
/// ```
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
|
|
@ -676,7 +676,7 @@ impl f32 {
|
|||
///
|
||||
/// let abs_difference = (x.sin() - 1.0).abs();
|
||||
///
|
||||
/// assert!(abs_difference <= 4.0 * f32::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-6);
|
||||
/// ```
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
|
|
@ -700,7 +700,7 @@ impl f32 {
|
|||
///
|
||||
/// let abs_difference = (x.cos() - 1.0).abs();
|
||||
///
|
||||
/// assert!(abs_difference <= 4.0 * f32::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-6);
|
||||
/// ```
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
|
|
@ -754,7 +754,7 @@ impl f32 {
|
|||
/// // asin(sin(pi/2))
|
||||
/// let abs_difference = (f.sin().asin() - std::f32::consts::FRAC_PI_2).abs();
|
||||
///
|
||||
/// assert!(abs_difference <= f32::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-3);
|
||||
/// ```
|
||||
#[doc(alias = "arcsin")]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
|
|
@ -784,7 +784,7 @@ impl f32 {
|
|||
/// // acos(cos(pi/4))
|
||||
/// let abs_difference = (f.cos().acos() - std::f32::consts::FRAC_PI_4).abs();
|
||||
///
|
||||
/// assert!(abs_difference <= 4.0 * f32::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-6);
|
||||
/// ```
|
||||
#[doc(alias = "arccos")]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
|
|
@ -884,8 +884,8 @@ impl f32 {
|
|||
/// let abs_difference_0 = (f.0 - x.sin()).abs();
|
||||
/// let abs_difference_1 = (f.1 - x.cos()).abs();
|
||||
///
|
||||
/// assert!(abs_difference_0 <= 4.0 * f32::EPSILON);
|
||||
/// assert!(abs_difference_1 <= 4.0 * f32::EPSILON);
|
||||
/// assert!(abs_difference_0 <= 1e-6);
|
||||
/// assert!(abs_difference_1 <= 1e-6);
|
||||
/// ```
|
||||
#[doc(alias = "sincos")]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
|
|
@ -1067,7 +1067,7 @@ impl f32 {
|
|||
///
|
||||
/// let abs_difference = (f - x).abs();
|
||||
///
|
||||
/// assert!(abs_difference <= 4.0 * f32::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-7);
|
||||
/// ```
|
||||
#[doc(alias = "arcsinh")]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
|
|
@ -1095,7 +1095,7 @@ impl f32 {
|
|||
///
|
||||
/// let abs_difference = (f - x).abs();
|
||||
///
|
||||
/// assert!(abs_difference <= 4.0 * f32::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-6);
|
||||
/// ```
|
||||
#[doc(alias = "arccosh")]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
|
|
|
|||
|
|
@ -304,7 +304,7 @@ impl f64 {
|
|||
/// ```
|
||||
/// let x = 2.0_f64;
|
||||
/// let abs_difference = (x.powi(2) - (x * x)).abs();
|
||||
/// assert!(abs_difference <= 8.0 * f64::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-14);
|
||||
///
|
||||
/// assert_eq!(f64::powi(f64::NAN, 0), 1.0);
|
||||
/// ```
|
||||
|
|
@ -328,7 +328,7 @@ impl f64 {
|
|||
/// ```
|
||||
/// let x = 2.0_f64;
|
||||
/// let abs_difference = (x.powf(2.0) - (x * x)).abs();
|
||||
/// assert!(abs_difference <= 8.0 * f64::EPSILON);
|
||||
/// assert!(abs_difference <= 1e-14);
|
||||
///
|
||||
/// assert_eq!(f64::powf(1.0, f64::NAN), 1.0);
|
||||
/// assert_eq!(f64::powf(f64::NAN, 0.0), 1.0);
|
||||
|
|
@ -754,7 +754,7 @@ impl f64 {
|
|||
/// // asin(sin(pi/2))
|
||||
/// let abs_difference = (f.sin().asin() - std::f64::consts::FRAC_PI_2).abs();
|
||||
///
|
||||
/// assert!(abs_difference < 1e-10);
|
||||
/// assert!(abs_difference < 1e-7);
|
||||
/// ```
|
||||
#[doc(alias = "arcsin")]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ use std::f32::consts;
|
|||
/// Miri adds some extra errors to float functions; make sure the tests still pass.
|
||||
/// These values are purely used as a canary to test against and are thus not a stable guarantee Rust provides.
|
||||
/// They serve as a way to get an idea of the real precision of floating point operations on different platforms.
|
||||
const APPROX_DELTA: f32 = if cfg!(miri) { 1e-4 } else { 1e-6 };
|
||||
const APPROX_DELTA: f32 = if cfg!(miri) { 1e-3 } else { 1e-6 };
|
||||
|
||||
#[allow(unused_macros)]
|
||||
macro_rules! assert_f32_biteq {
|
||||
|
|
@ -22,17 +22,9 @@ fn test_powf() {
|
|||
let inf: f32 = f32::INFINITY;
|
||||
let neg_inf: f32 = f32::NEG_INFINITY;
|
||||
assert_eq!(1.0f32.powf(1.0), 1.0);
|
||||
assert_approx_eq!(
|
||||
3.4f32.powf(4.5),
|
||||
246.408218,
|
||||
APPROX_DELTA /* Miri float-non-det: Make tests pass for now */
|
||||
);
|
||||
assert_approx_eq!(3.4f32.powf(4.5), 246.408218, APPROX_DELTA);
|
||||
assert_approx_eq!(2.7f32.powf(-3.2), 0.041652);
|
||||
assert_approx_eq!(
|
||||
(-3.1f32).powf(2.0),
|
||||
9.61,
|
||||
APPROX_DELTA /* Miri float-non-det: Make tests pass for now */
|
||||
);
|
||||
assert_approx_eq!((-3.1f32).powf(2.0), 9.61, APPROX_DELTA);
|
||||
assert_approx_eq!(5.9f32.powf(-2.0), 0.028727);
|
||||
assert_eq!(8.3f32.powf(0.0), 1.0);
|
||||
assert!(nan.powf(2.0).is_nan());
|
||||
|
|
@ -44,11 +36,7 @@ fn test_powf() {
|
|||
fn test_exp() {
|
||||
assert_eq!(1.0, 0.0f32.exp());
|
||||
assert_approx_eq!(2.718282, 1.0f32.exp(), APPROX_DELTA);
|
||||
assert_approx_eq!(
|
||||
148.413162,
|
||||
5.0f32.exp(),
|
||||
APPROX_DELTA /* Miri float-non-det: Make tests pass for now */
|
||||
);
|
||||
assert_approx_eq!(148.413162, 5.0f32.exp(), APPROX_DELTA);
|
||||
|
||||
let inf: f32 = f32::INFINITY;
|
||||
let neg_inf: f32 = f32::NEG_INFINITY;
|
||||
|
|
@ -60,11 +48,7 @@ fn test_exp() {
|
|||
|
||||
#[test]
|
||||
fn test_exp2() {
|
||||
assert_approx_eq!(
|
||||
32.0,
|
||||
5.0f32.exp2(),
|
||||
APPROX_DELTA /* Miri float-non-det: Make tests pass for now */
|
||||
);
|
||||
assert_approx_eq!(32.0, 5.0f32.exp2(), APPROX_DELTA);
|
||||
assert_eq!(1.0, 0.0f32.exp2());
|
||||
|
||||
let inf: f32 = f32::INFINITY;
|
||||
|
|
@ -87,11 +71,7 @@ fn test_ln() {
|
|||
assert!((-2.3f32).ln().is_nan());
|
||||
assert_eq!((-0.0f32).ln(), neg_inf);
|
||||
assert_eq!(0.0f32.ln(), neg_inf);
|
||||
assert_approx_eq!(
|
||||
4.0f32.ln(),
|
||||
1.386294,
|
||||
APPROX_DELTA /* Miri float-non-det: Make tests pass for now */
|
||||
);
|
||||
assert_approx_eq!(4.0f32.ln(), 1.386294, APPROX_DELTA);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -101,7 +81,7 @@ fn test_log() {
|
|||
let neg_inf: f32 = f32::NEG_INFINITY;
|
||||
assert_approx_eq!(10.0f32.log(10.0), 1.0);
|
||||
assert_approx_eq!(2.3f32.log(3.5), 0.664858);
|
||||
assert_approx_eq!(1.0f32.exp().log(1.0f32.exp()), 1.0);
|
||||
assert_approx_eq!(1.0f32.exp().log(1.0f32.exp()), 1.0, APPROX_DELTA);
|
||||
assert!(1.0f32.log(1.0).is_nan());
|
||||
assert!(1.0f32.log(-13.9).is_nan());
|
||||
assert!(nan.log(2.3).is_nan());
|
||||
|
|
@ -117,17 +97,9 @@ fn test_log2() {
|
|||
let nan: f32 = f32::NAN;
|
||||
let inf: f32 = f32::INFINITY;
|
||||
let neg_inf: f32 = f32::NEG_INFINITY;
|
||||
assert_approx_eq!(
|
||||
10.0f32.log2(),
|
||||
3.321928,
|
||||
APPROX_DELTA /* Miri float-non-det: Make tests pass for now */
|
||||
);
|
||||
assert_approx_eq!(10.0f32.log2(), 3.321928, APPROX_DELTA);
|
||||
assert_approx_eq!(2.3f32.log2(), 1.201634);
|
||||
assert_approx_eq!(
|
||||
1.0f32.exp().log2(),
|
||||
1.442695,
|
||||
APPROX_DELTA /* Miri float-non-det: Make tests pass for now */
|
||||
);
|
||||
assert_approx_eq!(1.0f32.exp().log2(), 1.442695, APPROX_DELTA);
|
||||
assert!(nan.log2().is_nan());
|
||||
assert_eq!(inf.log2(), inf);
|
||||
assert!(neg_inf.log2().is_nan());
|
||||
|
|
@ -191,11 +163,7 @@ fn test_acosh() {
|
|||
assert_approx_eq!(3.0f32.acosh(), 1.76274717403908605046521864995958461f32);
|
||||
|
||||
// test for low accuracy from issue 104548
|
||||
assert_approx_eq!(
|
||||
60.0f32,
|
||||
60.0f32.cosh().acosh(),
|
||||
APPROX_DELTA /* Miri float-non-det: Make tests pass for now */
|
||||
);
|
||||
assert_approx_eq!(60.0f32, 60.0f32.cosh().acosh(), APPROX_DELTA);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -274,11 +242,7 @@ fn test_real_consts() {
|
|||
let ln_10: f32 = consts::LN_10;
|
||||
|
||||
assert_approx_eq!(frac_pi_2, pi / 2f32);
|
||||
assert_approx_eq!(
|
||||
frac_pi_3,
|
||||
pi / 3f32,
|
||||
APPROX_DELTA /* Miri float-non-det: Make tests pass for now */
|
||||
);
|
||||
assert_approx_eq!(frac_pi_3, pi / 3f32, APPROX_DELTA);
|
||||
assert_approx_eq!(frac_pi_4, pi / 4f32);
|
||||
assert_approx_eq!(frac_pi_6, pi / 6f32);
|
||||
assert_approx_eq!(frac_pi_8, pi / 8f32);
|
||||
|
|
@ -290,9 +254,5 @@ fn test_real_consts() {
|
|||
assert_approx_eq!(log2_e, e.log2());
|
||||
assert_approx_eq!(log10_e, e.log10());
|
||||
assert_approx_eq!(ln_2, 2f32.ln());
|
||||
assert_approx_eq!(
|
||||
ln_10,
|
||||
10f32.ln(),
|
||||
APPROX_DELTA /* Miri float-non-det: Make tests pass for now */
|
||||
);
|
||||
assert_approx_eq!(ln_10, 10f32.ln(), APPROX_DELTA);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1034,7 +1034,7 @@ pub fn libm() {
|
|||
assert_approx_eq!(400f64.powf(0.5f64), 20f64);
|
||||
|
||||
// Some inputs to powf and powi result in fixed outputs
|
||||
// and thus must be exactly equal to that value
|
||||
// and thus must be exactly equal to that value.
|
||||
// C standard says:
|
||||
// 1^y = 1 for any y, even a NaN.
|
||||
assert_eq!(1f32.powf(10.0), 1.0);
|
||||
|
|
@ -1069,11 +1069,13 @@ pub fn libm() {
|
|||
|
||||
// For pow (powf in rust) the C standard says:
|
||||
// x^0 = 1 for all x even a sNaN
|
||||
// FIXME(#4286): this does not match the behavior of all implementations.
|
||||
assert_eq!(SNAN_F32.powf(0.0), 1.0);
|
||||
assert_eq!(SNAN_F64.powf(0.0), 1.0);
|
||||
|
||||
// For pown (powi in rust) the C standard says:
|
||||
// x^0 = 1 for all x even a sNaN
|
||||
// FIXME(#4286): this does not match the behavior of all implementations.
|
||||
assert_eq!(SNAN_F32.powi(0), 1.0);
|
||||
assert_eq!(SNAN_F64.powi(0), 1.0);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue