Skip to main content

scratch_test_value/math/
trig.rs

1use crate::{QuirkSink, SNumber, quirks::SNumberToFloatQ};
2
3impl SNumber {
4    pub fn q_cos<Q>(&self, sink: &mut Q) -> SNumber
5    where
6        Q: QuirkSink<SNumberToFloatQ>,
7    {
8        SNumber::Float(self.q_as_float_nan_is_zero(sink).cos())
9    }
10    pub fn q_sin<Q>(&self, sink: &mut Q) -> SNumber
11    where
12        Q: QuirkSink<SNumberToFloatQ>,
13    {
14        SNumber::Float(self.q_as_float_nan_is_zero(sink).sin())
15    }
16    pub fn q_tan<Q>(&self, sink: &mut Q) -> SNumber
17    where
18        Q: QuirkSink<SNumberToFloatQ>,
19    {
20        SNumber::Float(self.q_as_float_nan_is_zero(sink).tan())
21    }
22    pub fn q_acos<Q>(&self, sink: &mut Q) -> SNumber
23    where
24        Q: QuirkSink<SNumberToFloatQ>,
25    {
26        SNumber::Float(self.q_as_float_nan_is_zero(sink).acos())
27    }
28    pub fn q_asin<Q>(&self, sink: &mut Q) -> SNumber
29    where
30        Q: QuirkSink<SNumberToFloatQ>,
31    {
32        SNumber::Float(self.q_as_float_nan_is_zero(sink).asin())
33    }
34    pub fn q_atan<Q>(&self, sink: &mut Q) -> SNumber
35    where
36        Q: QuirkSink<SNumberToFloatQ>,
37    {
38        SNumber::Float(self.q_as_float_nan_is_zero(sink).atan())
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use crate::SNumber;
45
46    #[test]
47    fn test_special_trig() {
48        for s in [SNumber::INFINITY, SNumber::NEG_INFINITY] {
49            assert_eq!(SNumber::NAN, s.q_cos(&mut ()));
50            assert_eq!(SNumber::NAN, s.q_sin(&mut ()));
51            assert_eq!(SNumber::NAN, s.q_tan(&mut ()));
52        }
53    }
54}