@@ -337,6 +337,34 @@ impl Signed for f64 {
337
337
fn is_negative ( & self ) -> bool { * self < 0.0 || ( 1.0 / * self ) == neg_infinity }
338
338
}
339
339
340
+ impl Round for f64 {
341
+ /// Round half-way cases toward `neg_infinity`
342
+ #[ inline( always) ]
343
+ fn floor ( & self ) -> f64 { floor ( * self ) }
344
+
345
+ /// Round half-way cases toward `infinity`
346
+ #[ inline( always) ]
347
+ fn ceil ( & self ) -> f64 { ceil ( * self ) }
348
+
349
+ /// Round half-way cases away from `0.0`
350
+ #[ inline( always) ]
351
+ fn round ( & self ) -> f64 { round ( * self ) }
352
+
353
+ /// The integer part of the number (rounds towards `0.0`)
354
+ #[ inline( always) ]
355
+ fn trunc ( & self ) -> f64 { trunc ( * self ) }
356
+
357
+ ///
358
+ /// The fractional part of the number, satisfying:
359
+ ///
360
+ /// ~~~
361
+ /// assert!(x == trunc(x) + fract(x))
362
+ /// ~~~
363
+ ///
364
+ #[ inline( always) ]
365
+ fn fract ( & self ) -> f64 { * self - self . trunc ( ) }
366
+ }
367
+
340
368
impl Fractional for f64 {
341
369
/// The reciprocal (multiplicative inverse) of the number
342
370
#[ inline( always) ]
@@ -412,22 +440,6 @@ impl Real for f64 {
412
440
#[ inline( always) ]
413
441
fn log_10 ( ) -> f64 { 2.30258509299404568401799145468436421 }
414
442
415
- #[ inline( always) ]
416
- fn floor ( & self ) -> f64 { floor ( * self ) }
417
-
418
- #[ inline( always) ]
419
- fn ceil ( & self ) -> f64 { ceil ( * self ) }
420
-
421
- #[ inline( always) ]
422
- fn round ( & self ) -> f64 { round ( * self ) }
423
-
424
- #[ inline( always) ]
425
- fn trunc ( & self ) -> f64 { trunc ( * self ) }
426
-
427
- /// The fractional part of the number, calculated using: `n - floor(n)`
428
- #[ inline( always) ]
429
- fn fract ( & self ) -> f64 { * self - self . floor ( ) }
430
-
431
443
#[ inline( always) ]
432
444
fn pow ( & self , n : f64 ) -> f64 { pow ( * self , n) }
433
445
@@ -766,7 +778,8 @@ mod tests {
766
778
($a:expr, $b:expr) => ({
767
779
let a = $a, b = $b;
768
780
if !((a - b).abs() < 1.0e-6) {
769
- fail!(fmt!(" The values were not approximately equal. Found : %? and %?" , a, b) ) ;
781
+ fail!(fmt!(" The values were not approximately equal. \
782
+ Found : %? and expected %?" , a, b) ) ;
770
783
}
771
784
} )
772
785
)
@@ -776,6 +789,76 @@ mod tests {
776
789
num:: test_num ( 10f64 , 2f64 ) ;
777
790
}
778
791
792
+ #[ test]
793
+ fn test_floor ( ) {
794
+ assert_fuzzy_eq ! ( 1.0f64 . floor( ) , 1.0f64 ) ;
795
+ assert_fuzzy_eq ! ( 1.3f64 . floor( ) , 1.0f64 ) ;
796
+ assert_fuzzy_eq ! ( 1.5f64 . floor( ) , 1.0f64 ) ;
797
+ assert_fuzzy_eq ! ( 1.7f64 . floor( ) , 1.0f64 ) ;
798
+ assert_fuzzy_eq ! ( 0.0f64 . floor( ) , 0.0f64 ) ;
799
+ assert_fuzzy_eq ! ( ( -0.0f64 ) . floor( ) , -0.0f64 ) ;
800
+ assert_fuzzy_eq ! ( ( -1.0f64 ) . floor( ) , -1.0f64 ) ;
801
+ assert_fuzzy_eq ! ( ( -1.3f64 ) . floor( ) , -2.0f64 ) ;
802
+ assert_fuzzy_eq ! ( ( -1.5f64 ) . floor( ) , -2.0f64 ) ;
803
+ assert_fuzzy_eq ! ( ( -1.7f64 ) . floor( ) , -2.0f64 ) ;
804
+ }
805
+
806
+ #[ test]
807
+ fn test_ceil ( ) {
808
+ assert_fuzzy_eq ! ( 1.0f64 . ceil( ) , 1.0f64 ) ;
809
+ assert_fuzzy_eq ! ( 1.3f64 . ceil( ) , 2.0f64 ) ;
810
+ assert_fuzzy_eq ! ( 1.5f64 . ceil( ) , 2.0f64 ) ;
811
+ assert_fuzzy_eq ! ( 1.7f64 . ceil( ) , 2.0f64 ) ;
812
+ assert_fuzzy_eq ! ( 0.0f64 . ceil( ) , 0.0f64 ) ;
813
+ assert_fuzzy_eq ! ( ( -0.0f64 ) . ceil( ) , -0.0f64 ) ;
814
+ assert_fuzzy_eq ! ( ( -1.0f64 ) . ceil( ) , -1.0f64 ) ;
815
+ assert_fuzzy_eq ! ( ( -1.3f64 ) . ceil( ) , -1.0f64 ) ;
816
+ assert_fuzzy_eq ! ( ( -1.5f64 ) . ceil( ) , -1.0f64 ) ;
817
+ assert_fuzzy_eq ! ( ( -1.7f64 ) . ceil( ) , -1.0f64 ) ;
818
+ }
819
+
820
+ #[ test]
821
+ fn test_round ( ) {
822
+ assert_fuzzy_eq ! ( 1.0f64 . round( ) , 1.0f64 ) ;
823
+ assert_fuzzy_eq ! ( 1.3f64 . round( ) , 1.0f64 ) ;
824
+ assert_fuzzy_eq ! ( 1.5f64 . round( ) , 2.0f64 ) ;
825
+ assert_fuzzy_eq ! ( 1.7f64 . round( ) , 2.0f64 ) ;
826
+ assert_fuzzy_eq ! ( 0.0f64 . round( ) , 0.0f64 ) ;
827
+ assert_fuzzy_eq ! ( ( -0.0f64 ) . round( ) , -0.0f64 ) ;
828
+ assert_fuzzy_eq ! ( ( -1.0f64 ) . round( ) , -1.0f64 ) ;
829
+ assert_fuzzy_eq ! ( ( -1.3f64 ) . round( ) , -1.0f64 ) ;
830
+ assert_fuzzy_eq ! ( ( -1.5f64 ) . round( ) , -2.0f64 ) ;
831
+ assert_fuzzy_eq ! ( ( -1.7f64 ) . round( ) , -2.0f64 ) ;
832
+ }
833
+
834
+ #[ test]
835
+ fn test_trunc ( ) {
836
+ assert_fuzzy_eq ! ( 1.0f64 . trunc( ) , 1.0f64 ) ;
837
+ assert_fuzzy_eq ! ( 1.3f64 . trunc( ) , 1.0f64 ) ;
838
+ assert_fuzzy_eq ! ( 1.5f64 . trunc( ) , 1.0f64 ) ;
839
+ assert_fuzzy_eq ! ( 1.7f64 . trunc( ) , 1.0f64 ) ;
840
+ assert_fuzzy_eq ! ( 0.0f64 . trunc( ) , 0.0f64 ) ;
841
+ assert_fuzzy_eq ! ( ( -0.0f64 ) . trunc( ) , -0.0f64 ) ;
842
+ assert_fuzzy_eq ! ( ( -1.0f64 ) . trunc( ) , -1.0f64 ) ;
843
+ assert_fuzzy_eq ! ( ( -1.3f64 ) . trunc( ) , -1.0f64 ) ;
844
+ assert_fuzzy_eq ! ( ( -1.5f64 ) . trunc( ) , -1.0f64 ) ;
845
+ assert_fuzzy_eq ! ( ( -1.7f64 ) . trunc( ) , -1.0f64 ) ;
846
+ }
847
+
848
+ #[ test]
849
+ fn test_fract ( ) {
850
+ assert_fuzzy_eq ! ( 1.0f64 . fract( ) , 0.0f64 ) ;
851
+ assert_fuzzy_eq ! ( 1.3f64 . fract( ) , 0.3f64 ) ;
852
+ assert_fuzzy_eq ! ( 1.5f64 . fract( ) , 0.5f64 ) ;
853
+ assert_fuzzy_eq ! ( 1.7f64 . fract( ) , 0.7f64 ) ;
854
+ assert_fuzzy_eq ! ( 0.0f64 . fract( ) , 0.0f64 ) ;
855
+ assert_fuzzy_eq ! ( ( -0.0f64 ) . fract( ) , -0.0f64 ) ;
856
+ assert_fuzzy_eq ! ( ( -1.0f64 ) . fract( ) , -0.0f64 ) ;
857
+ assert_fuzzy_eq ! ( ( -1.3f64 ) . fract( ) , -0.3f64 ) ;
858
+ assert_fuzzy_eq ! ( ( -1.5f64 ) . fract( ) , -0.5f64 ) ;
859
+ assert_fuzzy_eq ! ( ( -1.7f64 ) . fract( ) , -0.7f64 ) ;
860
+ }
861
+
779
862
#[ test]
780
863
fn test_real_consts ( ) {
781
864
assert_fuzzy_eq ! ( Real :: two_pi:: <f64 >( ) , 2.0 * Real :: pi:: <f64 >( ) ) ;
0 commit comments