unsigned_f64/
lib.rs

1mod unsigned;
2#[allow(unused_imports)]
3pub use unsigned::*;
4
5#[cfg(test)]
6mod tests {
7    use super::*;
8
9    #[test]
10    fn it_works() {
11        let r = unsigned::UnsignedF64::new(2.0);
12        assert!(r.is_some());
13        assert!(f64::from(r.unwrap()) == 2.0);
14
15        let n = unsigned::UnsignedF64::new(-2.0);
16        assert_eq!(n, None);
17    }
18
19    #[test]
20    fn try_from() {
21        let r = unsigned::UnsignedF64::try_from(2.0);
22        assert!(r.is_ok());
23        assert!(f64::from(r.unwrap()) == 2.0);
24
25        let n = unsigned::UnsignedF64::try_from(-2.0);
26        assert!(n.is_err());
27    }
28
29    #[test]
30    fn add() {
31        let r = unsigned::UnsignedF64::new(2.0);
32        assert!(r.is_some());
33        let r = r.unwrap();
34
35        let n = unsigned::UnsignedF64::new(3.0);
36        assert!(n.is_some());
37        let n = n.unwrap();
38
39        let s = r + n;
40        assert!(f64::from(s) == 5.0);
41
42        let s = r + 3.0;
43        assert!(s == 5.0);
44    }
45
46    #[test]
47    fn sub() {
48        let r = unsigned::UnsignedF64::new(2.0);
49        assert!(r.is_some());
50        let r = r.unwrap();
51
52        let n = unsigned::UnsignedF64::new(3.0);
53        assert!(n.is_some());
54        let n = n.unwrap();
55
56        let s = r - n;
57        assert!(s == -1.0);
58
59        let s = r - 3.0;
60        assert!(s == -1.0);
61    }
62
63    #[test]
64    fn negate() {
65        let r = unsigned::UnsignedF64::new(2.0);
66        assert!(r.is_some());
67        let r = r.unwrap();
68
69        let n = -r;
70        assert!(f64::from(n) == -2.0);
71    }
72
73    #[test]
74    fn divide() {
75        let r = unsigned::UnsignedF64::new(2.0);
76        assert!(r.is_some());
77        let r = r.unwrap();
78
79        let n = unsigned::UnsignedF64::new(3.0);
80        assert!(n.is_some());
81        let n = n.unwrap();
82
83        let s = r / n;
84        assert!(f64::from(s) == 2.0 / 3.0);
85
86        let s = r / 3.0;
87        assert!(s == 2.0 / 3.0);
88    }
89
90    #[test]
91    fn test_square() {
92        let r = -2.;
93        let n = unsigned::UnsignedF64::square(r);
94        assert!(f64::from(n) == 4.0);
95    }
96
97    #[test]
98    fn test_neg_zero_issue() {
99        let one: crate::UnsignedF64 = crate::UnsignedF64::new(1.0).unwrap();
100        let neg_zero = crate::UnsignedF64::new(-0.0).unwrap();
101
102        let neg_inf: crate::UnsignedF64 = one / neg_zero;
103        let neg_pi_by_two = neg_inf.atan(); // Return PI/2 for -Inf
104        let neg_one = neg_pi_by_two.abs() / neg_pi_by_two;
105
106        println!("neg_one={neg_one}");
107
108        assert!(neg_one >= 0.0);
109    }
110}