Merge pull request #165 from m1el/rem_pio2_ret_medium

rem_pio2: actually return medium value for x ~ 2pi/2
This commit is contained in:
Alex Crichton 2019-05-13 12:21:10 -05:00 committed by GitHub
commit de8ed2dbc0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 1 deletions

View File

@ -85,7 +85,7 @@ pub(crate) fn rem_pio2(x: f64) -> (i32, f64, f64) {
/* |x| ~<= 5pi/4 */
if (ix & 0xfffff) == 0x921fb {
/* |x| ~= pi/2 or 2pi/2 */
medium(x, ix); /* cancellation -- use medium case */
return medium(x, ix); /* cancellation -- use medium case */
}
if ix <= 0x4002d97c {
/* |x| ~<= 3pi/4 */
@ -185,3 +185,23 @@ pub(crate) fn rem_pio2(x: f64) -> (i32, f64, f64) {
}
(n, ty[0], ty[1])
}
#[test]
fn test_near_pi() {
assert_eq!(
rem_pio2(3.141592025756836),
(2, -6.278329573009626e-7, -2.1125998133974653e-23)
);
assert_eq!(
rem_pio2(3.141592033207416),
(2, -6.20382377148128e-7, -2.1125998133974653e-23)
);
assert_eq!(
rem_pio2(3.141592144966125),
(2, -5.086236681942706e-7, -2.1125998133974653e-23)
);
assert_eq!(
rem_pio2(3.141592979431152),
(2, 3.2584135866119817e-7, -2.1125998133974653e-23)
);
}

View File

@ -77,3 +77,10 @@ pub fn sin(x: f64) -> f64 {
_ => -k_cos(y0, y1),
}
}
#[test]
fn test_near_pi() {
let x = f64::from_bits(0x400921fb000FD5DD); // 3.141592026217707
let sx = f64::from_bits(0x3ea50d15ced1a4a2); // 6.273720864039205e-7
assert_eq!(sin(x), sx);
}