@@ -485,6 +485,120 @@ mod tests {
485485 assert_eq ! ( 2.0f32 . max( NAN ) , 2.0 ) ;
486486 }
487487
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+
488602 #[ test]
489603 fn test_is_normal ( ) {
490604 let nan: f32 = Float :: nan ( ) ;
@@ -649,6 +763,66 @@ mod tests {
649763 assert ! ( !NAN . is_negative( ) ) ;
650764 }
651765
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+
652826 #[ test]
653827 fn test_sqrt_domain ( ) {
654828 assert ! ( NAN . sqrt( ) . is_nan( ) ) ;
@@ -660,6 +834,21 @@ mod tests {
660834 assert_eq ! ( INFINITY . sqrt( ) , INFINITY ) ;
661835 }
662836
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+
663852 #[ test]
664853 fn test_exp ( ) {
665854 assert_eq ! ( 1.0 , 0.0f32 . exp( ) ) ;
@@ -687,14 +876,111 @@ mod tests {
687876 assert ! ( nan. exp2( ) . is_nan( ) ) ;
688877 }
689878
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+
690974 #[ test]
691975 fn test_ldexp ( ) {
692976 // We have to use from_str until base-2 exponents
693977 // are supported in floating-point literals
694978 let f1: f32 = FromStrRadix :: from_str_radix ( "1p-123" , 16 ) . unwrap ( ) ;
695979 let f2: f32 = FromStrRadix :: from_str_radix ( "1p-111" , 16 ) . unwrap ( ) ;
980+ let f3: f32 = FromStrRadix :: from_str_radix ( "1.Cp-12" , 16 ) . unwrap ( ) ;
696981 assert_eq ! ( Float :: ldexp( 1f32 , -123 ) , f1) ;
697982 assert_eq ! ( Float :: ldexp( 1f32 , -111 ) , f2) ;
983+ assert_eq ! ( Float :: ldexp( 1.75f32 , -12 ) , f3) ;
698984
699985 assert_eq ! ( Float :: ldexp( 0f32 , -123 ) , 0f32 ) ;
700986 assert_eq ! ( Float :: ldexp( -0f32 , -123 ) , -0f32 ) ;
@@ -713,12 +999,16 @@ mod tests {
713999 // are supported in floating-point literals
7141000 let f1: f32 = FromStrRadix :: from_str_radix ( "1p-123" , 16 ) . unwrap ( ) ;
7151001 let f2: f32 = FromStrRadix :: from_str_radix ( "1p-111" , 16 ) . unwrap ( ) ;
1002+ let f3: f32 = FromStrRadix :: from_str_radix ( "1.Cp-123" , 16 ) . unwrap ( ) ;
7161003 let ( x1, exp1) = f1. frexp ( ) ;
7171004 let ( x2, exp2) = f2. frexp ( ) ;
1005+ let ( x3, exp3) = f3. frexp ( ) ;
7181006 assert_eq ! ( ( x1, exp1) , ( 0.5f32 , -122 ) ) ;
7191007 assert_eq ! ( ( x2, exp2) , ( 0.5f32 , -110 ) ) ;
1008+ assert_eq ! ( ( x3, exp3) , ( 0.875f32 , -122 ) ) ;
7201009 assert_eq ! ( Float :: ldexp( x1, exp1) , f1) ;
7211010 assert_eq ! ( Float :: ldexp( x2, exp2) , f2) ;
1011+ assert_eq ! ( Float :: ldexp( x3, exp3) , f3) ;
7221012
7231013 assert_eq ! ( 0f32 . frexp( ) , ( 0f32 , 0 ) ) ;
7241014 assert_eq ! ( ( -0f32 ) . frexp( ) , ( -0f32 , 0 ) ) ;
0 commit comments