Add tests to stable f32 and f64 methods that didn't have any
This commit is contained in:
parent
33d8a4efea
commit
8f091efa4f
2 changed files with 580 additions and 0 deletions
|
|
@ -485,6 +485,120 @@ mod tests {
|
|||
assert_eq!(2.0f32.max(NAN), 2.0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_nan() {
|
||||
let nan: f32 = Float::nan();
|
||||
assert!(nan.is_nan());
|
||||
assert!(!nan.is_infinite());
|
||||
assert!(!nan.is_finite());
|
||||
assert!(!nan.is_normal());
|
||||
assert!(!nan.is_positive());
|
||||
assert!(!nan.is_negative());
|
||||
assert_eq!(Fp::Nan, nan.classify());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_infinity() {
|
||||
let inf: f32 = Float::infinity();
|
||||
assert!(inf.is_infinite());
|
||||
assert!(!inf.is_finite());
|
||||
assert!(inf.is_positive());
|
||||
assert!(!inf.is_negative());
|
||||
assert!(!inf.is_nan());
|
||||
assert!(!inf.is_normal());
|
||||
assert_eq!(Fp::Infinite, inf.classify());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_neg_infinity() {
|
||||
let neg_inf: f32 = Float::neg_infinity();
|
||||
assert!(neg_inf.is_infinite());
|
||||
assert!(!neg_inf.is_finite());
|
||||
assert!(!neg_inf.is_positive());
|
||||
assert!(neg_inf.is_negative());
|
||||
assert!(!neg_inf.is_nan());
|
||||
assert!(!neg_inf.is_normal());
|
||||
assert_eq!(Fp::Infinite, neg_inf.classify());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_zero() {
|
||||
let zero: f32 = Float::zero();
|
||||
assert_eq!(0.0, zero);
|
||||
assert!(!zero.is_infinite());
|
||||
assert!(zero.is_finite());
|
||||
assert!(zero.is_positive());
|
||||
assert!(!zero.is_negative());
|
||||
assert!(!zero.is_nan());
|
||||
assert!(!zero.is_normal());
|
||||
assert_eq!(Fp::Zero, zero.classify());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_neg_zero() {
|
||||
let neg_zero: f32 = Float::neg_zero();
|
||||
assert_eq!(0.0, neg_zero);
|
||||
assert!(!neg_zero.is_infinite());
|
||||
assert!(neg_zero.is_finite());
|
||||
assert!(!neg_zero.is_positive());
|
||||
assert!(neg_zero.is_negative());
|
||||
assert!(!neg_zero.is_nan());
|
||||
assert!(!neg_zero.is_normal());
|
||||
assert_eq!(Fp::Zero, neg_zero.classify());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_one() {
|
||||
let one: f32 = Float::one();
|
||||
assert_eq!(1.0, one);
|
||||
assert!(!one.is_infinite());
|
||||
assert!(one.is_finite());
|
||||
assert!(one.is_positive());
|
||||
assert!(!one.is_negative());
|
||||
assert!(!one.is_nan());
|
||||
assert!(one.is_normal());
|
||||
assert_eq!(Fp::Normal, one.classify());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_nan() {
|
||||
let nan: f32 = Float::nan();
|
||||
let inf: f32 = Float::infinity();
|
||||
let neg_inf: f32 = Float::neg_infinity();
|
||||
assert!(nan.is_nan());
|
||||
assert!(!0.0f32.is_nan());
|
||||
assert!(!5.3f32.is_nan());
|
||||
assert!(!(-10.732f32).is_nan());
|
||||
assert!(!inf.is_nan());
|
||||
assert!(!neg_inf.is_nan());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_infinite() {
|
||||
let nan: f32 = Float::nan();
|
||||
let inf: f32 = Float::infinity();
|
||||
let neg_inf: f32 = Float::neg_infinity();
|
||||
assert!(!nan.is_infinite());
|
||||
assert!(inf.is_infinite());
|
||||
assert!(neg_inf.is_infinite());
|
||||
assert!(!0.0f32.is_infinite());
|
||||
assert!(!42.8f32.is_infinite());
|
||||
assert!(!(-109.2f32).is_infinite());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_finite() {
|
||||
let nan: f32 = Float::nan();
|
||||
let inf: f32 = Float::infinity();
|
||||
let neg_inf: f32 = Float::neg_infinity();
|
||||
assert!(!nan.is_finite());
|
||||
assert!(!inf.is_finite());
|
||||
assert!(!neg_inf.is_finite());
|
||||
assert!(0.0f32.is_finite());
|
||||
assert!(42.8f32.is_finite());
|
||||
assert!((-109.2f32).is_finite());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_normal() {
|
||||
let nan: f32 = Float::nan();
|
||||
|
|
@ -649,6 +763,66 @@ mod tests {
|
|||
assert!(!NAN.is_negative());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_mul_add() {
|
||||
let nan: f32 = Float::nan();
|
||||
let inf: f32 = Float::infinity();
|
||||
let neg_inf: f32 = Float::neg_infinity();
|
||||
assert_approx_eq!(12.3f32.mul_add(4.5, 6.7), 62.05);
|
||||
assert_approx_eq!((-12.3f32).mul_add(-4.5, -6.7), 48.65);
|
||||
assert_approx_eq!(0.0f32.mul_add(8.9, 1.2), 1.2);
|
||||
assert_approx_eq!(3.4f32.mul_add(-0.0, 5.6), 5.6);
|
||||
assert!(nan.mul_add(7.8, 9.0).is_nan());
|
||||
assert_eq!(inf.mul_add(7.8, 9.0), inf);
|
||||
assert_eq!(neg_inf.mul_add(7.8, 9.0), neg_inf);
|
||||
assert_eq!(8.9f32.mul_add(inf, 3.2), inf);
|
||||
assert_eq!((-3.2f32).mul_add(2.4, neg_inf), neg_inf);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_recip() {
|
||||
let nan: f32 = Float::nan();
|
||||
let inf: f32 = Float::infinity();
|
||||
let neg_inf: f32 = Float::neg_infinity();
|
||||
assert_eq!(1.0f32.recip(), 1.0);
|
||||
assert_eq!(2.0f32.recip(), 0.5);
|
||||
assert_eq!((-0.4f32).recip(), -2.5);
|
||||
assert_eq!(0.0f32.recip(), inf);
|
||||
assert!(nan.recip().is_nan());
|
||||
assert_eq!(inf.recip(), 0.0);
|
||||
assert_eq!(neg_inf.recip(), 0.0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_powi() {
|
||||
let nan: f32 = Float::nan();
|
||||
let inf: f32 = Float::infinity();
|
||||
let neg_inf: f32 = Float::neg_infinity();
|
||||
assert_eq!(1.0f32.powi(1), 1.0);
|
||||
assert_approx_eq!((-3.1f32).powi(2), 9.61);
|
||||
assert_approx_eq!(5.9f32.powi(-2), 0.028727);
|
||||
assert_eq!(8.3f32.powi(0), 1.0);
|
||||
assert!(nan.powi(2).is_nan());
|
||||
assert_eq!(inf.powi(3), inf);
|
||||
assert_eq!(neg_inf.powi(2), inf);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_powf() {
|
||||
let nan: f32 = Float::nan();
|
||||
let inf: f32 = Float::infinity();
|
||||
let neg_inf: f32 = Float::neg_infinity();
|
||||
assert_eq!(1.0f32.powf(1.0), 1.0);
|
||||
assert_approx_eq!(3.4f32.powf(4.5), 246.408218);
|
||||
assert_approx_eq!(2.7f32.powf(-3.2), 0.041652);
|
||||
assert_approx_eq!((-3.1f32).powf(2.0), 9.61);
|
||||
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());
|
||||
assert_eq!(inf.powf(2.0), inf);
|
||||
assert_eq!(neg_inf.powf(3.0), neg_inf);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_sqrt_domain() {
|
||||
assert!(NAN.sqrt().is_nan());
|
||||
|
|
@ -660,6 +834,21 @@ mod tests {
|
|||
assert_eq!(INFINITY.sqrt(), INFINITY);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_rsqrt() {
|
||||
let nan: f32 = Float::nan();
|
||||
let inf: f32 = Float::infinity();
|
||||
let neg_inf: f32 = Float::neg_infinity();
|
||||
assert!(nan.rsqrt().is_nan());
|
||||
assert_eq!(inf.rsqrt(), 0.0);
|
||||
assert!(neg_inf.rsqrt().is_nan());
|
||||
assert!((-1.0f32).rsqrt().is_nan());
|
||||
assert_eq!((-0.0f32).rsqrt(), neg_inf);
|
||||
assert_eq!(0.0f32.rsqrt(), inf);
|
||||
assert_eq!(1.0f32.rsqrt(), 1.0);
|
||||
assert_eq!(4.0f32.rsqrt(), 0.5);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_exp() {
|
||||
assert_eq!(1.0, 0.0f32.exp());
|
||||
|
|
@ -687,14 +876,111 @@ mod tests {
|
|||
assert!(nan.exp2().is_nan());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_ln() {
|
||||
let nan: f32 = Float::nan();
|
||||
let inf: f32 = Float::infinity();
|
||||
let neg_inf: f32 = Float::neg_infinity();
|
||||
assert_approx_eq!(1.0f32.exp().ln(), 1.0);
|
||||
assert!(nan.ln().is_nan());
|
||||
assert_eq!(inf.ln(), inf);
|
||||
assert!(neg_inf.ln().is_nan());
|
||||
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);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_log() {
|
||||
let nan: f32 = Float::nan();
|
||||
let inf: f32 = Float::infinity();
|
||||
let neg_inf: f32 = Float::neg_infinity();
|
||||
assert_eq!(10.0f32.log(10.0), 1.0);
|
||||
assert_approx_eq!(2.3f32.log(3.5), 0.664858);
|
||||
assert_eq!(1.0f32.exp().log(1.0.exp()), 1.0);
|
||||
assert!(1.0f32.log(1.0).is_nan());
|
||||
assert!(1.0f32.log(-13.9).is_nan());
|
||||
assert!(nan.log(2.3).is_nan());
|
||||
assert_eq!(inf.log(10.0), inf);
|
||||
assert!(neg_inf.log(8.8).is_nan());
|
||||
assert!((-2.3f32).log(0.1).is_nan());
|
||||
assert_eq!((-0.0f32).log(2.0), neg_inf);
|
||||
assert_eq!(0.0f32.log(7.0), neg_inf);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_log2() {
|
||||
let nan: f32 = Float::nan();
|
||||
let inf: f32 = Float::infinity();
|
||||
let neg_inf: f32 = Float::neg_infinity();
|
||||
assert_approx_eq!(10.0f32.log2(), 3.321928);
|
||||
assert_approx_eq!(2.3f32.log2(), 1.201634);
|
||||
assert_approx_eq!(1.0f32.exp().log2(), 1.442695);
|
||||
assert!(nan.log2().is_nan());
|
||||
assert_eq!(inf.log2(), inf);
|
||||
assert!(neg_inf.log2().is_nan());
|
||||
assert!((-2.3f32).log2().is_nan());
|
||||
assert_eq!((-0.0f32).log2(), neg_inf);
|
||||
assert_eq!(0.0f32.log2(), neg_inf);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_log10() {
|
||||
let nan: f32 = Float::nan();
|
||||
let inf: f32 = Float::infinity();
|
||||
let neg_inf: f32 = Float::neg_infinity();
|
||||
assert_eq!(10.0f32.log10(), 1.0);
|
||||
assert_approx_eq!(2.3f32.log10(), 0.361728);
|
||||
assert_approx_eq!(1.0f32.exp().log10(), 0.434294);
|
||||
assert_eq!(1.0f32.log10(), 0.0);
|
||||
assert!(nan.log10().is_nan());
|
||||
assert_eq!(inf.log10(), inf);
|
||||
assert!(neg_inf.log10().is_nan());
|
||||
assert!((-2.3f32).log10().is_nan());
|
||||
assert_eq!((-0.0f32).log10(), neg_inf);
|
||||
assert_eq!(0.0f32.log10(), neg_inf);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_to_degrees() {
|
||||
let pi: f32 = consts::PI;
|
||||
let nan: f32 = Float::nan();
|
||||
let inf: f32 = Float::infinity();
|
||||
let neg_inf: f32 = Float::neg_infinity();
|
||||
assert_eq!(0.0f32.to_degrees(), 0.0);
|
||||
assert_approx_eq!((-5.8f32).to_degrees(), -332.315521);
|
||||
assert_eq!(pi.to_degrees(), 180.0);
|
||||
assert!(nan.to_degrees().is_nan());
|
||||
assert_eq!(inf.to_degrees(), inf);
|
||||
assert_eq!(neg_inf.to_degrees(), neg_inf);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_to_radians() {
|
||||
let pi: f32 = consts::PI;
|
||||
let nan: f32 = Float::nan();
|
||||
let inf: f32 = Float::infinity();
|
||||
let neg_inf: f32 = Float::neg_infinity();
|
||||
assert_eq!(0.0f32.to_radians(), 0.0);
|
||||
assert_approx_eq!(154.6f32.to_radians(), 2.698279);
|
||||
assert_approx_eq!((-332.31f32).to_radians(), -5.799903);
|
||||
assert_eq!(180.0f32.to_radians(), pi);
|
||||
assert!(nan.to_radians().is_nan());
|
||||
assert_eq!(inf.to_radians(), inf);
|
||||
assert_eq!(neg_inf.to_radians(), neg_inf);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_ldexp() {
|
||||
// We have to use from_str until base-2 exponents
|
||||
// are supported in floating-point literals
|
||||
let f1: f32 = FromStrRadix::from_str_radix("1p-123", 16).unwrap();
|
||||
let f2: f32 = FromStrRadix::from_str_radix("1p-111", 16).unwrap();
|
||||
let f3: f32 = FromStrRadix::from_str_radix("1.Cp-12", 16).unwrap();
|
||||
assert_eq!(Float::ldexp(1f32, -123), f1);
|
||||
assert_eq!(Float::ldexp(1f32, -111), f2);
|
||||
assert_eq!(Float::ldexp(1.75f32, -12), f3);
|
||||
|
||||
assert_eq!(Float::ldexp(0f32, -123), 0f32);
|
||||
assert_eq!(Float::ldexp(-0f32, -123), -0f32);
|
||||
|
|
@ -713,12 +999,16 @@ mod tests {
|
|||
// are supported in floating-point literals
|
||||
let f1: f32 = FromStrRadix::from_str_radix("1p-123", 16).unwrap();
|
||||
let f2: f32 = FromStrRadix::from_str_radix("1p-111", 16).unwrap();
|
||||
let f3: f32 = FromStrRadix::from_str_radix("1.Cp-123", 16).unwrap();
|
||||
let (x1, exp1) = f1.frexp();
|
||||
let (x2, exp2) = f2.frexp();
|
||||
let (x3, exp3) = f3.frexp();
|
||||
assert_eq!((x1, exp1), (0.5f32, -122));
|
||||
assert_eq!((x2, exp2), (0.5f32, -110));
|
||||
assert_eq!((x3, exp3), (0.875f32, -122));
|
||||
assert_eq!(Float::ldexp(x1, exp1), f1);
|
||||
assert_eq!(Float::ldexp(x2, exp2), f2);
|
||||
assert_eq!(Float::ldexp(x3, exp3), f3);
|
||||
|
||||
assert_eq!(0f32.frexp(), (0f32, 0));
|
||||
assert_eq!((-0f32).frexp(), (-0f32, 0));
|
||||
|
|
|
|||
|
|
@ -494,6 +494,120 @@ mod tests {
|
|||
assert_eq!(2.0f64.max(NAN), 2.0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_nan() {
|
||||
let nan: f64 = Float::nan();
|
||||
assert!(nan.is_nan());
|
||||
assert!(!nan.is_infinite());
|
||||
assert!(!nan.is_finite());
|
||||
assert!(!nan.is_normal());
|
||||
assert!(!nan.is_positive());
|
||||
assert!(!nan.is_negative());
|
||||
assert_eq!(Fp::Nan, nan.classify());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_infinity() {
|
||||
let inf: f64 = Float::infinity();
|
||||
assert!(inf.is_infinite());
|
||||
assert!(!inf.is_finite());
|
||||
assert!(inf.is_positive());
|
||||
assert!(!inf.is_negative());
|
||||
assert!(!inf.is_nan());
|
||||
assert!(!inf.is_normal());
|
||||
assert_eq!(Fp::Infinite, inf.classify());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_neg_infinity() {
|
||||
let neg_inf: f64 = Float::neg_infinity();
|
||||
assert!(neg_inf.is_infinite());
|
||||
assert!(!neg_inf.is_finite());
|
||||
assert!(!neg_inf.is_positive());
|
||||
assert!(neg_inf.is_negative());
|
||||
assert!(!neg_inf.is_nan());
|
||||
assert!(!neg_inf.is_normal());
|
||||
assert_eq!(Fp::Infinite, neg_inf.classify());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_zero() {
|
||||
let zero: f64 = Float::zero();
|
||||
assert_eq!(0.0, zero);
|
||||
assert!(!zero.is_infinite());
|
||||
assert!(zero.is_finite());
|
||||
assert!(zero.is_positive());
|
||||
assert!(!zero.is_negative());
|
||||
assert!(!zero.is_nan());
|
||||
assert!(!zero.is_normal());
|
||||
assert_eq!(Fp::Zero, zero.classify());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_neg_zero() {
|
||||
let neg_zero: f64 = Float::neg_zero();
|
||||
assert_eq!(0.0, neg_zero);
|
||||
assert!(!neg_zero.is_infinite());
|
||||
assert!(neg_zero.is_finite());
|
||||
assert!(!neg_zero.is_positive());
|
||||
assert!(neg_zero.is_negative());
|
||||
assert!(!neg_zero.is_nan());
|
||||
assert!(!neg_zero.is_normal());
|
||||
assert_eq!(Fp::Zero, neg_zero.classify());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_one() {
|
||||
let one: f64 = Float::one();
|
||||
assert_eq!(1.0, one);
|
||||
assert!(!one.is_infinite());
|
||||
assert!(one.is_finite());
|
||||
assert!(one.is_positive());
|
||||
assert!(!one.is_negative());
|
||||
assert!(!one.is_nan());
|
||||
assert!(one.is_normal());
|
||||
assert_eq!(Fp::Normal, one.classify());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_nan() {
|
||||
let nan: f64 = Float::nan();
|
||||
let inf: f64 = Float::infinity();
|
||||
let neg_inf: f64 = Float::neg_infinity();
|
||||
assert!(nan.is_nan());
|
||||
assert!(!0.0f64.is_nan());
|
||||
assert!(!5.3f64.is_nan());
|
||||
assert!(!(-10.732f64).is_nan());
|
||||
assert!(!inf.is_nan());
|
||||
assert!(!neg_inf.is_nan());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_infinite() {
|
||||
let nan: f64 = Float::nan();
|
||||
let inf: f64 = Float::infinity();
|
||||
let neg_inf: f64 = Float::neg_infinity();
|
||||
assert!(!nan.is_infinite());
|
||||
assert!(inf.is_infinite());
|
||||
assert!(neg_inf.is_infinite());
|
||||
assert!(!0.0f64.is_infinite());
|
||||
assert!(!42.8f64.is_infinite());
|
||||
assert!(!(-109.2f64).is_infinite());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_finite() {
|
||||
let nan: f64 = Float::nan();
|
||||
let inf: f64 = Float::infinity();
|
||||
let neg_inf: f64 = Float::neg_infinity();
|
||||
assert!(!nan.is_finite());
|
||||
assert!(!inf.is_finite());
|
||||
assert!(!neg_inf.is_finite());
|
||||
assert!(0.0f64.is_finite());
|
||||
assert!(42.8f64.is_finite());
|
||||
assert!((-109.2f64).is_finite());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_normal() {
|
||||
let nan: f64 = Float::nan();
|
||||
|
|
@ -657,6 +771,66 @@ mod tests {
|
|||
assert!(!NAN.is_negative());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_mul_add() {
|
||||
let nan: f64 = Float::nan();
|
||||
let inf: f64 = Float::infinity();
|
||||
let neg_inf: f64 = Float::neg_infinity();
|
||||
assert_approx_eq!(12.3f64.mul_add(4.5, 6.7), 62.05);
|
||||
assert_approx_eq!((-12.3f64).mul_add(-4.5, -6.7), 48.65);
|
||||
assert_approx_eq!(0.0f64.mul_add(8.9, 1.2), 1.2);
|
||||
assert_approx_eq!(3.4f64.mul_add(-0.0, 5.6), 5.6);
|
||||
assert!(nan.mul_add(7.8, 9.0).is_nan());
|
||||
assert_eq!(inf.mul_add(7.8, 9.0), inf);
|
||||
assert_eq!(neg_inf.mul_add(7.8, 9.0), neg_inf);
|
||||
assert_eq!(8.9f64.mul_add(inf, 3.2), inf);
|
||||
assert_eq!((-3.2f64).mul_add(2.4, neg_inf), neg_inf);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_recip() {
|
||||
let nan: f64 = Float::nan();
|
||||
let inf: f64 = Float::infinity();
|
||||
let neg_inf: f64 = Float::neg_infinity();
|
||||
assert_eq!(1.0f64.recip(), 1.0);
|
||||
assert_eq!(2.0f64.recip(), 0.5);
|
||||
assert_eq!((-0.4f64).recip(), -2.5);
|
||||
assert_eq!(0.0f64.recip(), inf);
|
||||
assert!(nan.recip().is_nan());
|
||||
assert_eq!(inf.recip(), 0.0);
|
||||
assert_eq!(neg_inf.recip(), 0.0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_powi() {
|
||||
let nan: f64 = Float::nan();
|
||||
let inf: f64 = Float::infinity();
|
||||
let neg_inf: f64 = Float::neg_infinity();
|
||||
assert_eq!(1.0f64.powi(1), 1.0);
|
||||
assert_approx_eq!((-3.1f64).powi(2), 9.61);
|
||||
assert_approx_eq!(5.9f64.powi(-2), 0.028727);
|
||||
assert_eq!(8.3f64.powi(0), 1.0);
|
||||
assert!(nan.powi(2).is_nan());
|
||||
assert_eq!(inf.powi(3), inf);
|
||||
assert_eq!(neg_inf.powi(2), inf);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_powf() {
|
||||
let nan: f64 = Float::nan();
|
||||
let inf: f64 = Float::infinity();
|
||||
let neg_inf: f64 = Float::neg_infinity();
|
||||
assert_eq!(1.0f64.powf(1.0), 1.0);
|
||||
assert_approx_eq!(3.4f64.powf(4.5), 246.408183);
|
||||
assert_approx_eq!(2.7f64.powf(-3.2), 0.041652);
|
||||
assert_approx_eq!((-3.1f64).powf(2.0), 9.61);
|
||||
assert_approx_eq!(5.9f64.powf(-2.0), 0.028727);
|
||||
assert_eq!(8.3f64.powf(0.0), 1.0);
|
||||
assert!(nan.powf(2.0).is_nan());
|
||||
assert_eq!(inf.powf(2.0), inf);
|
||||
assert_eq!(neg_inf.powf(3.0), neg_inf);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_sqrt_domain() {
|
||||
assert!(NAN.sqrt().is_nan());
|
||||
|
|
@ -668,6 +842,21 @@ mod tests {
|
|||
assert_eq!(INFINITY.sqrt(), INFINITY);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_rsqrt() {
|
||||
let nan: f64 = Float::nan();
|
||||
let inf: f64 = Float::infinity();
|
||||
let neg_inf: f64 = Float::neg_infinity();
|
||||
assert!(nan.rsqrt().is_nan());
|
||||
assert_eq!(inf.rsqrt(), 0.0);
|
||||
assert!(neg_inf.rsqrt().is_nan());
|
||||
assert!((-1.0f64).rsqrt().is_nan());
|
||||
assert_eq!((-0.0f64).rsqrt(), neg_inf);
|
||||
assert_eq!(0.0f64.rsqrt(), inf);
|
||||
assert_eq!(1.0f64.rsqrt(), 1.0);
|
||||
assert_eq!(4.0f64.rsqrt(), 0.5);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_exp() {
|
||||
assert_eq!(1.0, 0.0f64.exp());
|
||||
|
|
@ -695,14 +884,111 @@ mod tests {
|
|||
assert!(nan.exp2().is_nan());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_ln() {
|
||||
let nan: f64 = Float::nan();
|
||||
let inf: f64 = Float::infinity();
|
||||
let neg_inf: f64 = Float::neg_infinity();
|
||||
assert_approx_eq!(1.0f64.exp().ln(), 1.0);
|
||||
assert!(nan.ln().is_nan());
|
||||
assert_eq!(inf.ln(), inf);
|
||||
assert!(neg_inf.ln().is_nan());
|
||||
assert!((-2.3f64).ln().is_nan());
|
||||
assert_eq!((-0.0f64).ln(), neg_inf);
|
||||
assert_eq!(0.0f64.ln(), neg_inf);
|
||||
assert_approx_eq!(4.0f64.ln(), 1.386294);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_log() {
|
||||
let nan: f64 = Float::nan();
|
||||
let inf: f64 = Float::infinity();
|
||||
let neg_inf: f64 = Float::neg_infinity();
|
||||
assert_eq!(10.0f64.log(10.0), 1.0);
|
||||
assert_approx_eq!(2.3f64.log(3.5), 0.664858);
|
||||
assert_eq!(1.0f64.exp().log(1.0.exp()), 1.0);
|
||||
assert!(1.0f64.log(1.0).is_nan());
|
||||
assert!(1.0f64.log(-13.9).is_nan());
|
||||
assert!(nan.log(2.3).is_nan());
|
||||
assert_eq!(inf.log(10.0), inf);
|
||||
assert!(neg_inf.log(8.8).is_nan());
|
||||
assert!((-2.3f64).log(0.1).is_nan());
|
||||
assert_eq!((-0.0f64).log(2.0), neg_inf);
|
||||
assert_eq!(0.0f64.log(7.0), neg_inf);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_log2() {
|
||||
let nan: f64 = Float::nan();
|
||||
let inf: f64 = Float::infinity();
|
||||
let neg_inf: f64 = Float::neg_infinity();
|
||||
assert_approx_eq!(10.0f64.log2(), 3.321928);
|
||||
assert_approx_eq!(2.3f64.log2(), 1.201634);
|
||||
assert_approx_eq!(1.0f64.exp().log2(), 1.442695);
|
||||
assert!(nan.log2().is_nan());
|
||||
assert_eq!(inf.log2(), inf);
|
||||
assert!(neg_inf.log2().is_nan());
|
||||
assert!((-2.3f64).log2().is_nan());
|
||||
assert_eq!((-0.0f64).log2(), neg_inf);
|
||||
assert_eq!(0.0f64.log2(), neg_inf);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_log10() {
|
||||
let nan: f64 = Float::nan();
|
||||
let inf: f64 = Float::infinity();
|
||||
let neg_inf: f64 = Float::neg_infinity();
|
||||
assert_eq!(10.0f64.log10(), 1.0);
|
||||
assert_approx_eq!(2.3f64.log10(), 0.361728);
|
||||
assert_approx_eq!(1.0f64.exp().log10(), 0.434294);
|
||||
assert_eq!(1.0f64.log10(), 0.0);
|
||||
assert!(nan.log10().is_nan());
|
||||
assert_eq!(inf.log10(), inf);
|
||||
assert!(neg_inf.log10().is_nan());
|
||||
assert!((-2.3f64).log10().is_nan());
|
||||
assert_eq!((-0.0f64).log10(), neg_inf);
|
||||
assert_eq!(0.0f64.log10(), neg_inf);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_to_degrees() {
|
||||
let pi: f64 = consts::PI;
|
||||
let nan: f64 = Float::nan();
|
||||
let inf: f64 = Float::infinity();
|
||||
let neg_inf: f64 = Float::neg_infinity();
|
||||
assert_eq!(0.0f64.to_degrees(), 0.0);
|
||||
assert_approx_eq!((-5.8f64).to_degrees(), -332.315521);
|
||||
assert_eq!(pi.to_degrees(), 180.0);
|
||||
assert!(nan.to_degrees().is_nan());
|
||||
assert_eq!(inf.to_degrees(), inf);
|
||||
assert_eq!(neg_inf.to_degrees(), neg_inf);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_to_radians() {
|
||||
let pi: f64 = consts::PI;
|
||||
let nan: f64 = Float::nan();
|
||||
let inf: f64 = Float::infinity();
|
||||
let neg_inf: f64 = Float::neg_infinity();
|
||||
assert_eq!(0.0f64.to_radians(), 0.0);
|
||||
assert_approx_eq!(154.6f64.to_radians(), 2.698279);
|
||||
assert_approx_eq!((-332.31f64).to_radians(), -5.799903);
|
||||
assert_eq!(180.0f64.to_radians(), pi);
|
||||
assert!(nan.to_radians().is_nan());
|
||||
assert_eq!(inf.to_radians(), inf);
|
||||
assert_eq!(neg_inf.to_radians(), neg_inf);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_ldexp() {
|
||||
// We have to use from_str until base-2 exponents
|
||||
// are supported in floating-point literals
|
||||
let f1: f64 = FromStrRadix::from_str_radix("1p-123", 16).unwrap();
|
||||
let f2: f64 = FromStrRadix::from_str_radix("1p-111", 16).unwrap();
|
||||
let f3: f64 = FromStrRadix::from_str_radix("1.Cp-12", 16).unwrap();
|
||||
assert_eq!(Float::ldexp(1f64, -123), f1);
|
||||
assert_eq!(Float::ldexp(1f64, -111), f2);
|
||||
assert_eq!(Float::ldexp(1.75f64, -12), f3);
|
||||
|
||||
assert_eq!(Float::ldexp(0f64, -123), 0f64);
|
||||
assert_eq!(Float::ldexp(-0f64, -123), -0f64);
|
||||
|
|
@ -721,12 +1007,16 @@ mod tests {
|
|||
// are supported in floating-point literals
|
||||
let f1: f64 = FromStrRadix::from_str_radix("1p-123", 16).unwrap();
|
||||
let f2: f64 = FromStrRadix::from_str_radix("1p-111", 16).unwrap();
|
||||
let f3: f64 = FromStrRadix::from_str_radix("1.Cp-123", 16).unwrap();
|
||||
let (x1, exp1) = f1.frexp();
|
||||
let (x2, exp2) = f2.frexp();
|
||||
let (x3, exp3) = f3.frexp();
|
||||
assert_eq!((x1, exp1), (0.5f64, -122));
|
||||
assert_eq!((x2, exp2), (0.5f64, -110));
|
||||
assert_eq!((x3, exp3), (0.875f64, -122));
|
||||
assert_eq!(Float::ldexp(x1, exp1), f1);
|
||||
assert_eq!(Float::ldexp(x2, exp2), f2);
|
||||
assert_eq!(Float::ldexp(x3, exp3), f3);
|
||||
|
||||
assert_eq!(0f64.frexp(), (0f64, 0));
|
||||
assert_eq!((-0f64).frexp(), (-0f64, 0));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue