mirror of
https://github.com/rust-lang/rust.git
synced 2025-11-24 19:26:54 +00:00
Currently, attributes for `no-panic` are gated behind both the `test` config and `assert_no_panic`, because `no-panic` is a dev dependency (so only available with test configuration). However, we only emit `assert_no_panic` when the test config is also set anyway, so there isn't any need to gate on both. Replace gates on `all(test, assert_no_panic)` with only `assert_no_panic`. This is simpler, and also has the benefit that attempting to check for panics without `--test` errors.
78 lines
2.3 KiB
Rust
78 lines
2.3 KiB
Rust
// origin: FreeBSD /usr/src/lib/msun/src/s_cos.c */
|
|
//
|
|
// ====================================================
|
|
// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
|
//
|
|
// Developed at SunPro, a Sun Microsystems, Inc. business.
|
|
// Permission to use, copy, modify, and distribute this
|
|
// software is freely granted, provided that this notice
|
|
// is preserved.
|
|
// ====================================================
|
|
|
|
use super::{k_cos, k_sin, rem_pio2};
|
|
|
|
// cos(x)
|
|
// Return cosine function of x.
|
|
//
|
|
// kernel function:
|
|
// k_sin ... sine function on [-pi/4,pi/4]
|
|
// k_cos ... cosine function on [-pi/4,pi/4]
|
|
// rem_pio2 ... argument reduction routine
|
|
//
|
|
// Method.
|
|
// Let S,C and T denote the sin, cos and tan respectively on
|
|
// [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
|
|
// in [-pi/4 , +pi/4], and let n = k mod 4.
|
|
// We have
|
|
//
|
|
// n sin(x) cos(x) tan(x)
|
|
// ----------------------------------------------------------
|
|
// 0 S C T
|
|
// 1 C -S -1/T
|
|
// 2 -S -C T
|
|
// 3 -C S -1/T
|
|
// ----------------------------------------------------------
|
|
//
|
|
// Special cases:
|
|
// Let trig be any of sin, cos, or tan.
|
|
// trig(+-INF) is NaN, with signals;
|
|
// trig(NaN) is that NaN;
|
|
//
|
|
// Accuracy:
|
|
// TRIG(x) returns trig(x) nearly rounded
|
|
//
|
|
|
|
/// The cosine of `x` (f64).
|
|
///
|
|
/// `x` is specified in radians.
|
|
#[cfg_attr(assert_no_panic, no_panic::no_panic)]
|
|
pub fn cos(x: f64) -> f64 {
|
|
let ix = (f64::to_bits(x) >> 32) as u32 & 0x7fffffff;
|
|
|
|
/* |x| ~< pi/4 */
|
|
if ix <= 0x3fe921fb {
|
|
if ix < 0x3e46a09e {
|
|
/* if x < 2**-27 * sqrt(2) */
|
|
/* raise inexact if x != 0 */
|
|
if x as i32 == 0 {
|
|
return 1.0;
|
|
}
|
|
}
|
|
return k_cos(x, 0.0);
|
|
}
|
|
|
|
/* cos(Inf or NaN) is NaN */
|
|
if ix >= 0x7ff00000 {
|
|
return x - x;
|
|
}
|
|
|
|
/* argument reduction needed */
|
|
let (n, y0, y1) = rem_pio2(x);
|
|
match n & 3 {
|
|
0 => k_cos(y0, y1),
|
|
1 => -k_sin(y0, y1, 1),
|
|
2 => -k_cos(y0, y1),
|
|
_ => k_sin(y0, y1, 1),
|
|
}
|
|
}
|