@@ -732,6 +732,111 @@ def test_true_divide_special_properties():
732732 np .testing .assert_allclose (float (result ), 3.0 , rtol = 1e-30 )
733733
734734
735+ @pytest .mark .parametrize (
736+ "x_val" ,
737+ [
738+ 0.0 , 1.0 , 2.0 , - 1.0 , - 2.0 ,
739+ 0.5 , - 0.5 ,
740+ 100.0 , 1000.0 , - 100.0 , - 1000.0 ,
741+ 1e-10 , - 1e-10 , 1e-20 , - 1e-20 ,
742+ float ("inf" ), float ("-inf" ), float ("nan" ), float ("-nan" ), - 0.0
743+ ]
744+ )
745+ @pytest .mark .parametrize (
746+ "y_val" ,
747+ [
748+ 0.0 , 1.0 , 2.0 , - 1.0 , - 2.0 ,
749+ 0.5 , - 0.5 ,
750+ 100.0 , 1000.0 , - 100.0 , - 1000.0 ,
751+ 1e-10 , - 1e-10 , 1e-20 , - 1e-20 ,
752+ float ("inf" ), float ("-inf" ), float ("nan" ), float ("-nan" ), - 0.0
753+ ]
754+ )
755+ def test_floor_divide (x_val , y_val ):
756+ """Test floor_divide ufunc with comprehensive edge cases"""
757+ x_quad = QuadPrecision (str (x_val ))
758+ y_quad = QuadPrecision (str (y_val ))
759+
760+ # Compute using QuadPrecision
761+ result_quad = np .floor_divide (x_quad , y_quad )
762+
763+ # Compute using float64 for comparison
764+ result_float64 = np .floor_divide (np .float64 (x_val ), np .float64 (y_val ))
765+
766+ # Compare results
767+ if np .isnan (result_float64 ):
768+ assert np .isnan (float (result_quad )), f"Expected NaN for floor_divide({ x_val } , { y_val } )"
769+ elif np .isinf (result_float64 ):
770+ assert np .isinf (float (result_quad )), f"Expected inf for floor_divide({ x_val } , { y_val } )"
771+ assert np .sign (float (result_quad )) == np .sign (result_float64 ), f"Sign mismatch for floor_divide({ x_val } , { y_val } )"
772+ else :
773+ # For finite results, check relative tolerance
774+ # Use absolute tolerance for large numbers due to float64 precision limits
775+ atol = max (1e-10 , abs (result_float64 ) * 1e-9 ) if abs (result_float64 ) > 1e6 else 1e-10
776+ np .testing .assert_allclose (
777+ float (result_quad ), result_float64 , rtol = 1e-12 , atol = atol ,
778+ err_msg = f"Mismatch for floor_divide({ x_val } , { y_val } )"
779+ )
780+ def test_floor_divide_special_properties ():
781+ """Test special mathematical properties of floor_divide"""
782+ # floor_divide(x, 1) = floor(x)
783+ x = QuadPrecision ("42.7" )
784+ result = np .floor_divide (x , QuadPrecision ("1.0" ))
785+ np .testing .assert_allclose (float (result ), 42.0 , rtol = 1e-30 )
786+
787+ # floor_divide(0, non-zero) = 0
788+ result = np .floor_divide (QuadPrecision ("0.0" ), QuadPrecision ("5.0" ))
789+ assert float (result ) == 0.0
790+
791+ # floor_divide by 0 gives inf (with appropriate sign)
792+ result = np .floor_divide (QuadPrecision ("1.0" ), QuadPrecision ("0.0" ))
793+ assert np .isinf (float (result )) and float (result ) > 0
794+
795+ result = np .floor_divide (QuadPrecision ("-1.0" ), QuadPrecision ("0.0" ))
796+ assert np .isinf (float (result )) and float (result ) < 0
797+
798+ # 0 / 0 = NaN
799+ result = np .floor_divide (QuadPrecision ("0.0" ), QuadPrecision ("0.0" ))
800+ assert np .isnan (float (result ))
801+
802+ # inf / inf = NaN
803+ result = np .floor_divide (QuadPrecision ("inf" ), QuadPrecision ("inf" ))
804+ assert np .isnan (float (result ))
805+
806+ # inf / finite_nonzero = NaN (NumPy behavior)
807+ result = np .floor_divide (QuadPrecision ("inf" ), QuadPrecision ("100.0" ))
808+ assert np .isnan (float (result ))
809+
810+ # finite / inf = 0
811+ result = np .floor_divide (QuadPrecision ("100.0" ), QuadPrecision ("inf" ))
812+ assert float (result ) == 0.0
813+
814+ # floor_divide rounds toward negative infinity
815+ result = np .floor_divide (QuadPrecision ("7.0" ), QuadPrecision ("3.0" ))
816+ assert float (result ) == 2.0 # floor(7/3) = floor(2.333...) = 2
817+
818+ result = np .floor_divide (QuadPrecision ("-7.0" ), QuadPrecision ("3.0" ))
819+ assert float (result ) == - 3.0 # floor(-7/3) = floor(-2.333...) = -3
820+
821+ result = np .floor_divide (QuadPrecision ("7.0" ), QuadPrecision ("-3.0" ))
822+ assert float (result ) == - 3.0 # floor(7/-3) = floor(-2.333...) = -3
823+
824+ result = np .floor_divide (QuadPrecision ("-7.0" ), QuadPrecision ("-3.0" ))
825+ assert float (result ) == 2.0 # floor(-7/-3) = floor(2.333...) = 2
826+
827+ # floor_divide(x, x) = 1 for positive finite non-zero x
828+ x = QuadPrecision ("7.123456789" )
829+ result = np .floor_divide (x , x )
830+ np .testing .assert_allclose (float (result ), 1.0 , rtol = 1e-30 )
831+
832+ # Relationship with floor and true_divide
833+ x = QuadPrecision ("10.5" )
834+ y = QuadPrecision ("3.2" )
835+ result_floor_divide = np .floor_divide (x , y )
836+ result_floor_true_divide = np .floor (np .true_divide (x , y ))
837+ np .testing .assert_allclose (float (result_floor_divide ), float (result_floor_true_divide ), rtol = 1e-30 )
838+
839+
735840def test_inf ():
736841 assert QuadPrecision ("inf" ) > QuadPrecision ("1e1000" )
737842 assert np .signbit (QuadPrecision ("inf" )) == 0
0 commit comments