@@ -15,7 +15,7 @@ use Integer;
1515use std:: cmp;
1616use std:: fmt;
1717use std:: from_str:: FromStr ;
18- use std:: num:: { Zero , One , ToStrRadix , FromStrRadix , Round } ;
18+ use std:: num:: { Zero , One , ToStrRadix , FromStrRadix } ;
1919use bigint:: { BigInt , BigUint , Sign , Plus , Minus } ;
2020
2121/// Represents the ratio between 2 numbers.
@@ -113,6 +113,40 @@ impl<T: Clone + Integer + Ord>
113113 pub fn recip ( & self ) -> Ratio < T > {
114114 Ratio :: new_raw ( self . denom . clone ( ) , self . numer . clone ( ) )
115115 }
116+
117+ pub fn floor ( & self ) -> Ratio < T > {
118+ if * self < Zero :: zero ( ) {
119+ Ratio :: from_integer ( ( self . numer - self . denom + One :: one ( ) ) / self . denom )
120+ } else {
121+ Ratio :: from_integer ( self . numer / self . denom )
122+ }
123+ }
124+
125+ pub fn ceil ( & self ) -> Ratio < T > {
126+ if * self < Zero :: zero ( ) {
127+ Ratio :: from_integer ( self . numer / self . denom )
128+ } else {
129+ Ratio :: from_integer ( ( self . numer + self . denom - One :: one ( ) ) / self . denom )
130+ }
131+ }
132+
133+ #[ inline]
134+ pub fn round ( & self ) -> Ratio < T > {
135+ if * self < Zero :: zero ( ) {
136+ Ratio :: from_integer ( ( self . numer - self . denom + One :: one ( ) ) / self . denom )
137+ } else {
138+ Ratio :: from_integer ( ( self . numer + self . denom - One :: one ( ) ) / self . denom )
139+ }
140+ }
141+
142+ #[ inline]
143+ pub fn trunc ( & self ) -> Ratio < T > {
144+ Ratio :: from_integer ( self . numer / self . denom )
145+ }
146+
147+ pub fn fract ( & self ) -> Ratio < T > {
148+ Ratio :: new_raw ( self . numer % self . denom , self . denom . clone ( ) )
149+ }
116150}
117151
118152impl Ratio < BigInt > {
@@ -238,45 +272,6 @@ impl<T: Clone + Integer + Ord>
238272impl < T : Clone + Integer + Ord >
239273 Num for Ratio < T > { }
240274
241- /* Utils */
242- impl < T : Clone + Integer + Ord >
243- Round for Ratio < T > {
244-
245- fn floor ( & self ) -> Ratio < T > {
246- if * self < Zero :: zero ( ) {
247- Ratio :: from_integer ( ( self . numer - self . denom + One :: one ( ) ) / self . denom )
248- } else {
249- Ratio :: from_integer ( self . numer / self . denom )
250- }
251- }
252-
253- fn ceil ( & self ) -> Ratio < T > {
254- if * self < Zero :: zero ( ) {
255- Ratio :: from_integer ( self . numer / self . denom )
256- } else {
257- Ratio :: from_integer ( ( self . numer + self . denom - One :: one ( ) ) / self . denom )
258- }
259- }
260-
261- #[ inline]
262- fn round ( & self ) -> Ratio < T > {
263- if * self < Zero :: zero ( ) {
264- Ratio :: from_integer ( ( self . numer - self . denom + One :: one ( ) ) / self . denom )
265- } else {
266- Ratio :: from_integer ( ( self . numer + self . denom - One :: one ( ) ) / self . denom )
267- }
268- }
269-
270- #[ inline]
271- fn trunc ( & self ) -> Ratio < T > {
272- Ratio :: from_integer ( self . numer / self . denom )
273- }
274-
275- fn fract ( & self ) -> Ratio < T > {
276- Ratio :: new_raw ( self . numer % self . denom , self . denom . clone ( ) )
277- }
278- }
279-
280275/* String conversions */
281276impl < T : fmt:: Show > fmt:: Show for Ratio < T > {
282277 /// Renders as `numer/denom`.
@@ -636,19 +631,19 @@ mod test {
636631
637632 // f32
638633 test ( 3.14159265359f32 , ( "13176795" , "4194304" ) ) ;
639- test ( 2f32 . powf ( & 100. ) , ( "1267650600228229401496703205376" , "1" ) ) ;
640- test ( -2f32 . powf ( & 100. ) , ( "-1267650600228229401496703205376" , "1" ) ) ;
641- test ( 1.0 / 2f32 . powf ( & 100. ) , ( "1" , "1267650600228229401496703205376" ) ) ;
634+ test ( 2f32 . powf ( 100. ) , ( "1267650600228229401496703205376" , "1" ) ) ;
635+ test ( -2f32 . powf ( 100. ) , ( "-1267650600228229401496703205376" , "1" ) ) ;
636+ test ( 1.0 / 2f32 . powf ( 100. ) , ( "1" , "1267650600228229401496703205376" ) ) ;
642637 test ( 684729.48391f32 , ( "1369459" , "2" ) ) ;
643638 test ( -8573.5918555f32 , ( "-4389679" , "512" ) ) ;
644639
645640 // f64
646641 test ( 3.14159265359f64 , ( "3537118876014453" , "1125899906842624" ) ) ;
647- test ( 2f64 . powf ( & 100. ) , ( "1267650600228229401496703205376" , "1" ) ) ;
648- test ( -2f64 . powf ( & 100. ) , ( "-1267650600228229401496703205376" , "1" ) ) ;
642+ test ( 2f64 . powf ( 100. ) , ( "1267650600228229401496703205376" , "1" ) ) ;
643+ test ( -2f64 . powf ( 100. ) , ( "-1267650600228229401496703205376" , "1" ) ) ;
649644 test ( 684729.48391f64 , ( "367611342500051" , "536870912" ) ) ;
650645 test ( -8573.5918555 , ( "-4713381968463931" , "549755813888" ) ) ;
651- test ( 1.0 / 2f64 . powf ( & 100. ) , ( "1" , "1267650600228229401496703205376" ) ) ;
646+ test ( 1.0 / 2f64 . powf ( 100. ) , ( "1" , "1267650600228229401496703205376" ) ) ;
652647 }
653648
654649 #[ test]
0 commit comments