@@ -608,19 +608,19 @@ abstract static class DivModNode extends FloatBinaryBuiltinNode {
608
608
@ Specialization
609
609
PTuple doDL (double left , long right ) {
610
610
raiseDivisionByZero (right == 0 );
611
- return factory ().createTuple (new Object []{Math .floor (left / right ), left % right });
611
+ return factory ().createTuple (new Object []{Math .floor (left / right ), ModNode . op ( left , right ) });
612
612
}
613
613
614
614
@ Specialization
615
615
PTuple doDD (double left , double right ) {
616
616
raiseDivisionByZero (right == 0.0 );
617
- return factory ().createTuple (new Object []{Math .floor (left / right ), left % right });
617
+ return factory ().createTuple (new Object []{Math .floor (left / right ), ModNode . op ( left , right ) });
618
618
}
619
619
620
620
@ Specialization
621
621
PTuple doLD (long left , double right ) {
622
622
raiseDivisionByZero (right == 0.0 );
623
- return factory ().createTuple (new Object []{Math .floor (left / right ), left % right });
623
+ return factory ().createTuple (new Object []{Math .floor (left / right ), ModNode . op ( left , right ) });
624
624
}
625
625
626
626
@ Specialization (guards = {"accepts(left)" , "accepts(right)" })
@@ -820,42 +820,54 @@ public String hexD(double value) {
820
820
@ Builtin (name = __MOD__ , minNumOfPositionalArgs = 2 )
821
821
@ TypeSystemReference (PythonArithmeticTypes .class )
822
822
@ GenerateNodeFactory
823
- abstract static class ModNode extends FloatBinaryBuiltinNode {
823
+ public abstract static class ModNode extends FloatBinaryBuiltinNode {
824
824
@ Specialization
825
825
double doDL (double left , long right ) {
826
826
raiseDivisionByZero (right == 0 );
827
- return left % right ;
827
+ return op ( left , right ) ;
828
828
}
829
829
830
830
@ Specialization
831
831
double doDL (double left , PInt right ) {
832
832
raiseDivisionByZero (right .isZero ());
833
- return left % right .doubleValue ();
833
+ return op ( left , right .doubleValue () );
834
834
}
835
835
836
836
@ Specialization
837
837
double doDD (double left , double right ) {
838
838
raiseDivisionByZero (right == 0.0 );
839
- return left % right ;
839
+ return op ( left , right ) ;
840
840
}
841
841
842
842
@ Specialization
843
843
double doLD (long left , double right ) {
844
844
raiseDivisionByZero (right == 0.0 );
845
- return left % right ;
845
+ return op ( left , right ) ;
846
846
}
847
847
848
848
@ Specialization
849
849
double doPiD (PInt left , double right ) {
850
850
raiseDivisionByZero (right == 0.0 );
851
- return left .doubleValue () % right ;
851
+ return op ( left .doubleValue (), right ) ;
852
852
}
853
853
854
854
@ SuppressWarnings ("unused" )
855
855
@ Fallback
856
856
PNotImplemented doGeneric (Object right , Object left ) {
857
857
return PNotImplemented .NOT_IMPLEMENTED ;
858
858
}
859
+
860
+ public static double op (double left , double right ) {
861
+ double mod = left % right ;
862
+ if (mod != 0.0 ) {
863
+ if ((right < 0 ) != (mod < 0 )) {
864
+ mod += right ;
865
+ }
866
+ } else {
867
+ mod = right < 0 ? -0.0 : 0.0 ;
868
+ }
869
+ return mod ;
870
+ }
859
871
}
860
872
861
873
@ Builtin (name = __RTRUEDIV__ , minNumOfPositionalArgs = 2 , reverseOperation = true )
0 commit comments