@@ -485,6 +485,120 @@ mod tests {
485
485
assert_eq ! ( 2.0f32 . max( NAN ) , 2.0 ) ;
486
486
}
487
487
488
+ #[ test]
489
+ fn test_nan ( ) {
490
+ let nan: f32 = Float :: nan ( ) ;
491
+ assert ! ( nan. is_nan( ) ) ;
492
+ assert ! ( !nan. is_infinite( ) ) ;
493
+ assert ! ( !nan. is_finite( ) ) ;
494
+ assert ! ( !nan. is_normal( ) ) ;
495
+ assert ! ( !nan. is_positive( ) ) ;
496
+ assert ! ( !nan. is_negative( ) ) ;
497
+ assert_eq ! ( Fp :: Nan , nan. classify( ) ) ;
498
+ }
499
+
500
+ #[ test]
501
+ fn test_infinity ( ) {
502
+ let inf: f32 = Float :: infinity ( ) ;
503
+ assert ! ( inf. is_infinite( ) ) ;
504
+ assert ! ( !inf. is_finite( ) ) ;
505
+ assert ! ( inf. is_positive( ) ) ;
506
+ assert ! ( !inf. is_negative( ) ) ;
507
+ assert ! ( !inf. is_nan( ) ) ;
508
+ assert ! ( !inf. is_normal( ) ) ;
509
+ assert_eq ! ( Fp :: Infinite , inf. classify( ) ) ;
510
+ }
511
+
512
+ #[ test]
513
+ fn test_neg_infinity ( ) {
514
+ let neg_inf: f32 = Float :: neg_infinity ( ) ;
515
+ assert ! ( neg_inf. is_infinite( ) ) ;
516
+ assert ! ( !neg_inf. is_finite( ) ) ;
517
+ assert ! ( !neg_inf. is_positive( ) ) ;
518
+ assert ! ( neg_inf. is_negative( ) ) ;
519
+ assert ! ( !neg_inf. is_nan( ) ) ;
520
+ assert ! ( !neg_inf. is_normal( ) ) ;
521
+ assert_eq ! ( Fp :: Infinite , neg_inf. classify( ) ) ;
522
+ }
523
+
524
+ #[ test]
525
+ fn test_zero ( ) {
526
+ let zero: f32 = Float :: zero ( ) ;
527
+ assert_eq ! ( 0.0 , zero) ;
528
+ assert ! ( !zero. is_infinite( ) ) ;
529
+ assert ! ( zero. is_finite( ) ) ;
530
+ assert ! ( zero. is_positive( ) ) ;
531
+ assert ! ( !zero. is_negative( ) ) ;
532
+ assert ! ( !zero. is_nan( ) ) ;
533
+ assert ! ( !zero. is_normal( ) ) ;
534
+ assert_eq ! ( Fp :: Zero , zero. classify( ) ) ;
535
+ }
536
+
537
+ #[ test]
538
+ fn test_neg_zero ( ) {
539
+ let neg_zero: f32 = Float :: neg_zero ( ) ;
540
+ assert_eq ! ( 0.0 , neg_zero) ;
541
+ assert ! ( !neg_zero. is_infinite( ) ) ;
542
+ assert ! ( neg_zero. is_finite( ) ) ;
543
+ assert ! ( !neg_zero. is_positive( ) ) ;
544
+ assert ! ( neg_zero. is_negative( ) ) ;
545
+ assert ! ( !neg_zero. is_nan( ) ) ;
546
+ assert ! ( !neg_zero. is_normal( ) ) ;
547
+ assert_eq ! ( Fp :: Zero , neg_zero. classify( ) ) ;
548
+ }
549
+
550
+ #[ test]
551
+ fn test_one ( ) {
552
+ let one: f32 = Float :: one ( ) ;
553
+ assert_eq ! ( 1.0 , one) ;
554
+ assert ! ( !one. is_infinite( ) ) ;
555
+ assert ! ( one. is_finite( ) ) ;
556
+ assert ! ( one. is_positive( ) ) ;
557
+ assert ! ( !one. is_negative( ) ) ;
558
+ assert ! ( !one. is_nan( ) ) ;
559
+ assert ! ( one. is_normal( ) ) ;
560
+ assert_eq ! ( Fp :: Normal , one. classify( ) ) ;
561
+ }
562
+
563
+ #[ test]
564
+ fn test_is_nan ( ) {
565
+ let nan: f32 = Float :: nan ( ) ;
566
+ let inf: f32 = Float :: infinity ( ) ;
567
+ let neg_inf: f32 = Float :: neg_infinity ( ) ;
568
+ assert ! ( nan. is_nan( ) ) ;
569
+ assert ! ( !0.0f32 . is_nan( ) ) ;
570
+ assert ! ( !5.3f32 . is_nan( ) ) ;
571
+ assert ! ( !( -10.732f32 ) . is_nan( ) ) ;
572
+ assert ! ( !inf. is_nan( ) ) ;
573
+ assert ! ( !neg_inf. is_nan( ) ) ;
574
+ }
575
+
576
+ #[ test]
577
+ fn test_is_infinite ( ) {
578
+ let nan: f32 = Float :: nan ( ) ;
579
+ let inf: f32 = Float :: infinity ( ) ;
580
+ let neg_inf: f32 = Float :: neg_infinity ( ) ;
581
+ assert ! ( !nan. is_infinite( ) ) ;
582
+ assert ! ( inf. is_infinite( ) ) ;
583
+ assert ! ( neg_inf. is_infinite( ) ) ;
584
+ assert ! ( !0.0f32 . is_infinite( ) ) ;
585
+ assert ! ( !42.8f32 . is_infinite( ) ) ;
586
+ assert ! ( !( -109.2f32 ) . is_infinite( ) ) ;
587
+ }
588
+
589
+ #[ test]
590
+ fn test_is_finite ( ) {
591
+ let nan: f32 = Float :: nan ( ) ;
592
+ let inf: f32 = Float :: infinity ( ) ;
593
+ let neg_inf: f32 = Float :: neg_infinity ( ) ;
594
+ assert ! ( !nan. is_finite( ) ) ;
595
+ assert ! ( !inf. is_finite( ) ) ;
596
+ assert ! ( !neg_inf. is_finite( ) ) ;
597
+ assert ! ( 0.0f32 . is_finite( ) ) ;
598
+ assert ! ( 42.8f32 . is_finite( ) ) ;
599
+ assert ! ( ( -109.2f32 ) . is_finite( ) ) ;
600
+ }
601
+
488
602
#[ test]
489
603
fn test_is_normal ( ) {
490
604
let nan: f32 = Float :: nan ( ) ;
@@ -649,6 +763,66 @@ mod tests {
649
763
assert ! ( !NAN . is_negative( ) ) ;
650
764
}
651
765
766
+ #[ test]
767
+ fn test_mul_add ( ) {
768
+ let nan: f32 = Float :: nan ( ) ;
769
+ let inf: f32 = Float :: infinity ( ) ;
770
+ let neg_inf: f32 = Float :: neg_infinity ( ) ;
771
+ assert_approx_eq ! ( 12.3f32 . mul_add( 4.5 , 6.7 ) , 62.05 ) ;
772
+ assert_approx_eq ! ( ( -12.3f32 ) . mul_add( -4.5 , -6.7 ) , 48.65 ) ;
773
+ assert_approx_eq ! ( 0.0f32 . mul_add( 8.9 , 1.2 ) , 1.2 ) ;
774
+ assert_approx_eq ! ( 3.4f32 . mul_add( -0.0 , 5.6 ) , 5.6 ) ;
775
+ assert ! ( nan. mul_add( 7.8 , 9.0 ) . is_nan( ) ) ;
776
+ assert_eq ! ( inf. mul_add( 7.8 , 9.0 ) , inf) ;
777
+ assert_eq ! ( neg_inf. mul_add( 7.8 , 9.0 ) , neg_inf) ;
778
+ assert_eq ! ( 8.9f32 . mul_add( inf, 3.2 ) , inf) ;
779
+ assert_eq ! ( ( -3.2f32 ) . mul_add( 2.4 , neg_inf) , neg_inf) ;
780
+ }
781
+
782
+ #[ test]
783
+ fn test_recip ( ) {
784
+ let nan: f32 = Float :: nan ( ) ;
785
+ let inf: f32 = Float :: infinity ( ) ;
786
+ let neg_inf: f32 = Float :: neg_infinity ( ) ;
787
+ assert_eq ! ( 1.0f32 . recip( ) , 1.0 ) ;
788
+ assert_eq ! ( 2.0f32 . recip( ) , 0.5 ) ;
789
+ assert_eq ! ( ( -0.4f32 ) . recip( ) , -2.5 ) ;
790
+ assert_eq ! ( 0.0f32 . recip( ) , inf) ;
791
+ assert ! ( nan. recip( ) . is_nan( ) ) ;
792
+ assert_eq ! ( inf. recip( ) , 0.0 ) ;
793
+ assert_eq ! ( neg_inf. recip( ) , 0.0 ) ;
794
+ }
795
+
796
+ #[ test]
797
+ fn test_powi ( ) {
798
+ let nan: f32 = Float :: nan ( ) ;
799
+ let inf: f32 = Float :: infinity ( ) ;
800
+ let neg_inf: f32 = Float :: neg_infinity ( ) ;
801
+ assert_eq ! ( 1.0f32 . powi( 1 ) , 1.0 ) ;
802
+ assert_approx_eq ! ( ( -3.1f32 ) . powi( 2 ) , 9.61 ) ;
803
+ assert_approx_eq ! ( 5.9f32 . powi( -2 ) , 0.028727 ) ;
804
+ assert_eq ! ( 8.3f32 . powi( 0 ) , 1.0 ) ;
805
+ assert ! ( nan. powi( 2 ) . is_nan( ) ) ;
806
+ assert_eq ! ( inf. powi( 3 ) , inf) ;
807
+ assert_eq ! ( neg_inf. powi( 2 ) , inf) ;
808
+ }
809
+
810
+ #[ test]
811
+ fn test_powf ( ) {
812
+ let nan: f32 = Float :: nan ( ) ;
813
+ let inf: f32 = Float :: infinity ( ) ;
814
+ let neg_inf: f32 = Float :: neg_infinity ( ) ;
815
+ assert_eq ! ( 1.0f32 . powf( 1.0 ) , 1.0 ) ;
816
+ assert_approx_eq ! ( 3.4f32 . powf( 4.5 ) , 246.408218 ) ;
817
+ assert_approx_eq ! ( 2.7f32 . powf( -3.2 ) , 0.041652 ) ;
818
+ assert_approx_eq ! ( ( -3.1f32 ) . powf( 2.0 ) , 9.61 ) ;
819
+ assert_approx_eq ! ( 5.9f32 . powf( -2.0 ) , 0.028727 ) ;
820
+ assert_eq ! ( 8.3f32 . powf( 0.0 ) , 1.0 ) ;
821
+ assert ! ( nan. powf( 2.0 ) . is_nan( ) ) ;
822
+ assert_eq ! ( inf. powf( 2.0 ) , inf) ;
823
+ assert_eq ! ( neg_inf. powf( 3.0 ) , neg_inf) ;
824
+ }
825
+
652
826
#[ test]
653
827
fn test_sqrt_domain ( ) {
654
828
assert ! ( NAN . sqrt( ) . is_nan( ) ) ;
@@ -660,6 +834,21 @@ mod tests {
660
834
assert_eq ! ( INFINITY . sqrt( ) , INFINITY ) ;
661
835
}
662
836
837
+ #[ test]
838
+ fn test_rsqrt ( ) {
839
+ let nan: f32 = Float :: nan ( ) ;
840
+ let inf: f32 = Float :: infinity ( ) ;
841
+ let neg_inf: f32 = Float :: neg_infinity ( ) ;
842
+ assert ! ( nan. rsqrt( ) . is_nan( ) ) ;
843
+ assert_eq ! ( inf. rsqrt( ) , 0.0 ) ;
844
+ assert ! ( neg_inf. rsqrt( ) . is_nan( ) ) ;
845
+ assert ! ( ( -1.0f32 ) . rsqrt( ) . is_nan( ) ) ;
846
+ assert_eq ! ( ( -0.0f32 ) . rsqrt( ) , neg_inf) ;
847
+ assert_eq ! ( 0.0f32 . rsqrt( ) , inf) ;
848
+ assert_eq ! ( 1.0f32 . rsqrt( ) , 1.0 ) ;
849
+ assert_eq ! ( 4.0f32 . rsqrt( ) , 0.5 ) ;
850
+ }
851
+
663
852
#[ test]
664
853
fn test_exp ( ) {
665
854
assert_eq ! ( 1.0 , 0.0f32 . exp( ) ) ;
@@ -687,14 +876,111 @@ mod tests {
687
876
assert ! ( nan. exp2( ) . is_nan( ) ) ;
688
877
}
689
878
879
+ #[ test]
880
+ fn test_ln ( ) {
881
+ let nan: f32 = Float :: nan ( ) ;
882
+ let inf: f32 = Float :: infinity ( ) ;
883
+ let neg_inf: f32 = Float :: neg_infinity ( ) ;
884
+ assert_approx_eq ! ( 1.0f32 . exp( ) . ln( ) , 1.0 ) ;
885
+ assert ! ( nan. ln( ) . is_nan( ) ) ;
886
+ assert_eq ! ( inf. ln( ) , inf) ;
887
+ assert ! ( neg_inf. ln( ) . is_nan( ) ) ;
888
+ assert ! ( ( -2.3f32 ) . ln( ) . is_nan( ) ) ;
889
+ assert_eq ! ( ( -0.0f32 ) . ln( ) , neg_inf) ;
890
+ assert_eq ! ( 0.0f32 . ln( ) , neg_inf) ;
891
+ assert_approx_eq ! ( 4.0f32 . ln( ) , 1.386294 ) ;
892
+ }
893
+
894
+ #[ test]
895
+ fn test_log ( ) {
896
+ let nan: f32 = Float :: nan ( ) ;
897
+ let inf: f32 = Float :: infinity ( ) ;
898
+ let neg_inf: f32 = Float :: neg_infinity ( ) ;
899
+ assert_eq ! ( 10.0f32 . log( 10.0 ) , 1.0 ) ;
900
+ assert_approx_eq ! ( 2.3f32 . log( 3.5 ) , 0.664858 ) ;
901
+ assert_eq ! ( 1.0f32 . exp( ) . log( 1.0 . exp( ) ) , 1.0 ) ;
902
+ assert ! ( 1.0f32 . log( 1.0 ) . is_nan( ) ) ;
903
+ assert ! ( 1.0f32 . log( -13.9 ) . is_nan( ) ) ;
904
+ assert ! ( nan. log( 2.3 ) . is_nan( ) ) ;
905
+ assert_eq ! ( inf. log( 10.0 ) , inf) ;
906
+ assert ! ( neg_inf. log( 8.8 ) . is_nan( ) ) ;
907
+ assert ! ( ( -2.3f32 ) . log( 0.1 ) . is_nan( ) ) ;
908
+ assert_eq ! ( ( -0.0f32 ) . log( 2.0 ) , neg_inf) ;
909
+ assert_eq ! ( 0.0f32 . log( 7.0 ) , neg_inf) ;
910
+ }
911
+
912
+ #[ test]
913
+ fn test_log2 ( ) {
914
+ let nan: f32 = Float :: nan ( ) ;
915
+ let inf: f32 = Float :: infinity ( ) ;
916
+ let neg_inf: f32 = Float :: neg_infinity ( ) ;
917
+ assert_approx_eq ! ( 10.0f32 . log2( ) , 3.321928 ) ;
918
+ assert_approx_eq ! ( 2.3f32 . log2( ) , 1.201634 ) ;
919
+ assert_approx_eq ! ( 1.0f32 . exp( ) . log2( ) , 1.442695 ) ;
920
+ assert ! ( nan. log2( ) . is_nan( ) ) ;
921
+ assert_eq ! ( inf. log2( ) , inf) ;
922
+ assert ! ( neg_inf. log2( ) . is_nan( ) ) ;
923
+ assert ! ( ( -2.3f32 ) . log2( ) . is_nan( ) ) ;
924
+ assert_eq ! ( ( -0.0f32 ) . log2( ) , neg_inf) ;
925
+ assert_eq ! ( 0.0f32 . log2( ) , neg_inf) ;
926
+ }
927
+
928
+ #[ test]
929
+ fn test_log10 ( ) {
930
+ let nan: f32 = Float :: nan ( ) ;
931
+ let inf: f32 = Float :: infinity ( ) ;
932
+ let neg_inf: f32 = Float :: neg_infinity ( ) ;
933
+ assert_eq ! ( 10.0f32 . log10( ) , 1.0 ) ;
934
+ assert_approx_eq ! ( 2.3f32 . log10( ) , 0.361728 ) ;
935
+ assert_approx_eq ! ( 1.0f32 . exp( ) . log10( ) , 0.434294 ) ;
936
+ assert_eq ! ( 1.0f32 . log10( ) , 0.0 ) ;
937
+ assert ! ( nan. log10( ) . is_nan( ) ) ;
938
+ assert_eq ! ( inf. log10( ) , inf) ;
939
+ assert ! ( neg_inf. log10( ) . is_nan( ) ) ;
940
+ assert ! ( ( -2.3f32 ) . log10( ) . is_nan( ) ) ;
941
+ assert_eq ! ( ( -0.0f32 ) . log10( ) , neg_inf) ;
942
+ assert_eq ! ( 0.0f32 . log10( ) , neg_inf) ;
943
+ }
944
+
945
+ #[ test]
946
+ fn test_to_degrees ( ) {
947
+ let pi: f32 = consts:: PI ;
948
+ let nan: f32 = Float :: nan ( ) ;
949
+ let inf: f32 = Float :: infinity ( ) ;
950
+ let neg_inf: f32 = Float :: neg_infinity ( ) ;
951
+ assert_eq ! ( 0.0f32 . to_degrees( ) , 0.0 ) ;
952
+ assert_approx_eq ! ( ( -5.8f32 ) . to_degrees( ) , -332.315521 ) ;
953
+ assert_eq ! ( pi. to_degrees( ) , 180.0 ) ;
954
+ assert ! ( nan. to_degrees( ) . is_nan( ) ) ;
955
+ assert_eq ! ( inf. to_degrees( ) , inf) ;
956
+ assert_eq ! ( neg_inf. to_degrees( ) , neg_inf) ;
957
+ }
958
+
959
+ #[ test]
960
+ fn test_to_radians ( ) {
961
+ let pi: f32 = consts:: PI ;
962
+ let nan: f32 = Float :: nan ( ) ;
963
+ let inf: f32 = Float :: infinity ( ) ;
964
+ let neg_inf: f32 = Float :: neg_infinity ( ) ;
965
+ assert_eq ! ( 0.0f32 . to_radians( ) , 0.0 ) ;
966
+ assert_approx_eq ! ( 154.6f32 . to_radians( ) , 2.698279 ) ;
967
+ assert_approx_eq ! ( ( -332.31f32 ) . to_radians( ) , -5.799903 ) ;
968
+ assert_eq ! ( 180.0f32 . to_radians( ) , pi) ;
969
+ assert ! ( nan. to_radians( ) . is_nan( ) ) ;
970
+ assert_eq ! ( inf. to_radians( ) , inf) ;
971
+ assert_eq ! ( neg_inf. to_radians( ) , neg_inf) ;
972
+ }
973
+
690
974
#[ test]
691
975
fn test_ldexp ( ) {
692
976
// We have to use from_str until base-2 exponents
693
977
// are supported in floating-point literals
694
978
let f1: f32 = FromStrRadix :: from_str_radix ( "1p-123" , 16 ) . unwrap ( ) ;
695
979
let f2: f32 = FromStrRadix :: from_str_radix ( "1p-111" , 16 ) . unwrap ( ) ;
980
+ let f3: f32 = FromStrRadix :: from_str_radix ( "1.Cp-12" , 16 ) . unwrap ( ) ;
696
981
assert_eq ! ( Float :: ldexp( 1f32 , -123 ) , f1) ;
697
982
assert_eq ! ( Float :: ldexp( 1f32 , -111 ) , f2) ;
983
+ assert_eq ! ( Float :: ldexp( 1.75f32 , -12 ) , f3) ;
698
984
699
985
assert_eq ! ( Float :: ldexp( 0f32 , -123 ) , 0f32 ) ;
700
986
assert_eq ! ( Float :: ldexp( -0f32 , -123 ) , -0f32 ) ;
@@ -713,12 +999,16 @@ mod tests {
713
999
// are supported in floating-point literals
714
1000
let f1: f32 = FromStrRadix :: from_str_radix ( "1p-123" , 16 ) . unwrap ( ) ;
715
1001
let f2: f32 = FromStrRadix :: from_str_radix ( "1p-111" , 16 ) . unwrap ( ) ;
1002
+ let f3: f32 = FromStrRadix :: from_str_radix ( "1.Cp-123" , 16 ) . unwrap ( ) ;
716
1003
let ( x1, exp1) = f1. frexp ( ) ;
717
1004
let ( x2, exp2) = f2. frexp ( ) ;
1005
+ let ( x3, exp3) = f3. frexp ( ) ;
718
1006
assert_eq ! ( ( x1, exp1) , ( 0.5f32 , -122 ) ) ;
719
1007
assert_eq ! ( ( x2, exp2) , ( 0.5f32 , -110 ) ) ;
1008
+ assert_eq ! ( ( x3, exp3) , ( 0.875f32 , -122 ) ) ;
720
1009
assert_eq ! ( Float :: ldexp( x1, exp1) , f1) ;
721
1010
assert_eq ! ( Float :: ldexp( x2, exp2) , f2) ;
1011
+ assert_eq ! ( Float :: ldexp( x3, exp3) , f3) ;
722
1012
723
1013
assert_eq ! ( 0f32 . frexp( ) , ( 0f32 , 0 ) ) ;
724
1014
assert_eq ! ( ( -0f32 ) . frexp( ) , ( -0f32 , 0 ) ) ;
0 commit comments