@@ -259,7 +259,11 @@ impl Float for f32 {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn sqrt(self) -> f32 {
|
fn sqrt(self) -> f32 {
|
||||||
unsafe { intrinsics::sqrtf32(self) }
|
if self < 0.0 {
|
||||||
|
NAN
|
||||||
|
} else {
|
||||||
|
unsafe { intrinsics::sqrtf32(self) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|||||||
@@ -266,7 +266,11 @@ impl Float for f64 {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn sqrt(self) -> f64 {
|
fn sqrt(self) -> f64 {
|
||||||
unsafe { intrinsics::sqrtf64(self) }
|
if self < 0.0 {
|
||||||
|
NAN
|
||||||
|
} else {
|
||||||
|
unsafe { intrinsics::sqrtf64(self) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@@ -377,4 +381,3 @@ impl Float for f64 {
|
|||||||
self * (value / 180.0)
|
self * (value / 180.0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1501,6 +1501,8 @@ pub trait Float: Signed + Primitive {
|
|||||||
fn frac_1_sqrt2() -> Self;
|
fn frac_1_sqrt2() -> Self;
|
||||||
|
|
||||||
/// Take the square root of a number.
|
/// Take the square root of a number.
|
||||||
|
///
|
||||||
|
/// Returns NaN if `self` is not a non-negative number.
|
||||||
fn sqrt(self) -> Self;
|
fn sqrt(self) -> Self;
|
||||||
/// Take the reciprocal (inverse) square root of a number, `1/sqrt(x)`.
|
/// Take the reciprocal (inverse) square root of a number, `1/sqrt(x)`.
|
||||||
fn rsqrt(self) -> Self;
|
fn rsqrt(self) -> Self;
|
||||||
|
|||||||
@@ -787,4 +787,15 @@ mod tests {
|
|||||||
assert_eq!(NEG_INFINITY.integer_decode(), (8388608u64, 105i16, -1i8));
|
assert_eq!(NEG_INFINITY.integer_decode(), (8388608u64, 105i16, -1i8));
|
||||||
assert_eq!(NAN.integer_decode(), (12582912u64, 105i16, 1i8));
|
assert_eq!(NAN.integer_decode(), (12582912u64, 105i16, 1i8));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_sqrt_domain() {
|
||||||
|
assert!(NAN.sqrt().is_nan());
|
||||||
|
assert!(NEG_INFINITY.sqrt().is_nan());
|
||||||
|
assert!((-1.0f32).sqrt().is_nan());
|
||||||
|
assert_eq!((-0.0f32).sqrt(), -0.0);
|
||||||
|
assert_eq!(0.0f32.sqrt(), 0.0);
|
||||||
|
assert_eq!(1.0f32.sqrt(), 1.0);
|
||||||
|
assert_eq!(INFINITY.sqrt(), INFINITY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -789,4 +789,15 @@ mod tests {
|
|||||||
assert_eq!(NEG_INFINITY.integer_decode(), (4503599627370496, 972, -1));
|
assert_eq!(NEG_INFINITY.integer_decode(), (4503599627370496, 972, -1));
|
||||||
assert_eq!(NAN.integer_decode(), (6755399441055744u64, 972i16, 1i8));
|
assert_eq!(NAN.integer_decode(), (6755399441055744u64, 972i16, 1i8));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_sqrt_domain() {
|
||||||
|
assert!(NAN.sqrt().is_nan());
|
||||||
|
assert!(NEG_INFINITY.sqrt().is_nan());
|
||||||
|
assert!((-1.0f64).sqrt().is_nan());
|
||||||
|
assert_eq!((-0.0f64).sqrt(), -0.0);
|
||||||
|
assert_eq!(0.0f64.sqrt(), 0.0);
|
||||||
|
assert_eq!(1.0f64.sqrt(), 1.0);
|
||||||
|
assert_eq!(INFINITY.sqrt(), INFINITY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user