Fix sincosf for interval (7*pi/4, 9*pi/4) (#233)
A mistake was made in porting musl's implementation which caused the sin and cos components to be reversed. closes rust-lang/libm#232
This commit is contained in:
parent
3b3f3e977c
commit
a8d9eb7521
1 changed files with 22 additions and 4 deletions
|
|
@ -89,11 +89,11 @@ pub fn sincosf(x: f32) -> (f32, f32) {
|
|||
}
|
||||
} else {
|
||||
if sign {
|
||||
s = k_cosf((x + S4PIO2) as f64);
|
||||
c = k_sinf((x + S4PIO2) as f64);
|
||||
s = k_sinf((x + S4PIO2) as f64);
|
||||
c = k_cosf((x + S4PIO2) as f64);
|
||||
} else {
|
||||
s = k_cosf((x - S4PIO2) as f64);
|
||||
c = k_sinf((x - S4PIO2) as f64);
|
||||
s = k_sinf((x - S4PIO2) as f64);
|
||||
c = k_cosf((x - S4PIO2) as f64);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -133,4 +133,22 @@ mod tests {
|
|||
_eqf(s.abs(), 0.0).unwrap();
|
||||
_eqf(c, -1.0).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rotational_symmetry() {
|
||||
use core::f32::consts::PI;
|
||||
const N: usize = 24;
|
||||
for n in 0..N {
|
||||
let theta = 2. * PI * (n as f32) / (N as f32);
|
||||
let (s, c) = sincosf(theta);
|
||||
let (s_plus, c_plus) = sincosf(theta + 2. * PI);
|
||||
let (s_minus, c_minus) = sincosf(theta - 2. * PI);
|
||||
|
||||
const TOLERANCE: f32 = 1e-6;
|
||||
assert!((s - s_plus).abs() < TOLERANCE);
|
||||
assert!((s - s_minus).abs() < TOLERANCE);
|
||||
assert!((c - c_plus).abs() < TOLERANCE);
|
||||
assert!((c - c_minus).abs() < TOLERANCE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue