rust/fpnum/src/lib.rs
changeset 13884 fbbb4fcd6a75
parent 13883 2bfd7472ef1d
child 13885 cd39e87d7a80
equal deleted inserted replaced
13883:2bfd7472ef1d 13884:fbbb4fcd6a75
   125 }
   125 }
   126 
   126 
   127 impl Ord for FPNum {
   127 impl Ord for FPNum {
   128     #[inline]
   128     #[inline]
   129     fn cmp(&self, rhs: &Self) -> cmp::Ordering {
   129     fn cmp(&self, rhs: &Self) -> cmp::Ordering {
   130         if self.value == 0 && rhs.value == 0 {
   130         #[inline]
   131             cmp::Ordering::Equal
   131         fn extend(n: &FPNum) -> i128 {
   132         } else if self.is_negative != rhs.is_negative {
   132             if n.is_negative {
   133             if self.is_negative {
   133                 -(n.value as i128)
   134                 cmp::Ordering::Less
       
   135             } else {
   134             } else {
   136                 cmp::Ordering::Greater
   135                 n.value as i128
   137             }
   136             }
   138         } else if self.value == rhs.value {
   137         }
   139             cmp::Ordering::Equal
   138         extend(self).cmp(&(extend(rhs)))
   140         } else if self.is_negative {
       
   141             if self.value > rhs.value {
       
   142                 cmp::Ordering::Less
       
   143             } else {
       
   144                 cmp::Ordering::Greater
       
   145             }
       
   146         } else {
       
   147             if self.value < rhs.value {
       
   148                 cmp::Ordering::Less
       
   149             } else {
       
   150                 cmp::Ordering::Greater
       
   151             }
       
   152         }
       
   153     }
   139     }
   154 }
   140 }
   155 
   141 
   156 impl ops::Add for FPNum {
   142 impl ops::Add for FPNum {
   157     type Output = Self;
   143     type Output = Self;
   312     assert_eq!(n - n, z);
   298     assert_eq!(n - n, z);
   313     assert_eq!(-n + n, z);
   299     assert_eq!(-n + n, z);
   314 }
   300 }
   315 
   301 
   316 #[test]
   302 #[test]
       
   303 fn ord() {
       
   304     let z = FPNum::from(0);;
       
   305     let n1_5 = FPNum::new(3, 2);
       
   306     let n2_25 = FPNum::new(9, 4);
       
   307 
       
   308     assert!(!(z > z));
       
   309     assert!(!(z < z));
       
   310     assert!(n2_25 > n1_5);
       
   311     assert!(-n2_25 < n1_5);
       
   312     assert!(-n2_25 < -n1_5);
       
   313 }
       
   314 
       
   315 #[test]
   317 fn arith() {
   316 fn arith() {
   318     let n1_5 = FPNum::new(3, 2);
   317     let n1_5 = FPNum::new(3, 2);
   319     let n2_25 = FPNum::new(9, 4);
   318     let n2_25 = FPNum::new(9, 4);
   320     let n_0_15 = FPNum::new(-15, 100);
   319     let n_0_15 = FPNum::new(-15, 100);
   321 
   320