fixed the remainder issue: should not be negative.

This commit is contained in:
Norayr Chilingarian 2020-06-12 19:39:02 +04:00
parent cfa8aa2c39
commit daa6601c56
2 changed files with 46 additions and 20 deletions

View file

@ -37,13 +37,13 @@ INT64 SYSTEM_DIV(INT64 x, INT64 y)
INT64 SYSTEM_MOD(INT64 x, INT64 y) INT64 SYSTEM_MOD(INT64 x, INT64 y)
{ {
if (x == 0) return 0; if (x == 0) {return 0;}
if (x >= 0) INT64 m = x % y;
if (y >= 0) {return x % y;} if (m < 0)
else {return (y+1) + ((x-1) % (-y));} {
else m = (y < 0) ? m - y : m + y;
if (y >= 0) {return (y-1) - ((-x-1) % y);} }
else {return -((-x) % (-y));} return m;
} }
INT64 SYSTEM_ENTIER(double x) INT64 SYSTEM_ENTIER(double x)

View file

@ -4,6 +4,8 @@ IMPORT SYSTEM, Console;
VAR gz: LONGREAL; VAR gz: LONGREAL;
PROCEDURE -cpumod(x, y: INTEGER): INTEGER "(INT64)(x % y)";
PROCEDURE TestShiftResult(of, by, actual, expected: LONGINT; msg: ARRAY OF CHAR); PROCEDURE TestShiftResult(of, by, actual, expected: LONGINT; msg: ARRAY OF CHAR);
BEGIN BEGIN
IF actual # expected THEN IF actual # expected THEN
@ -172,7 +174,7 @@ END TestValue;
PROCEDURE side(i: INTEGER): INTEGER; BEGIN RETURN i END side; PROCEDURE side(i: INTEGER): INTEGER; BEGIN RETURN i END side;
PROCEDURE DivMod; PROCEDURE DivMod;
VAR i,j: INTEGER; VAR i,j, m: INTEGER;
BEGIN BEGIN
j := 2; j := 2;
i := 4; TestValue(i DIV j, 2, "4 DIV 2"); TestValue(side(i) DIV side(j), 2, "side(4) DIV side(2)"); i := 4; TestValue(i DIV j, 2, "4 DIV 2"); TestValue(side(i) DIV side(j), 2, "side(4) DIV side(2)");
@ -203,20 +205,44 @@ BEGIN
i := 6; j := 3; TestValue(i MOD j, i - ((i DIV j) * j), "6 MOD 3"); i := 6; j := 3; TestValue(i MOD j, i - ((i DIV j) * j), "6 MOD 3");
i := 7; j := 3; TestValue(i MOD j, i - ((i DIV j) * j), "7 MOD 3"); i := 7; j := 3; TestValue(i MOD j, i - ((i DIV j) * j), "7 MOD 3");
i := -4; j := 3; TestValue(i MOD j, i - ((i DIV j) * j), "-4 MOD 3"); i := -4; j := 3;
i := -5; j := 3; TestValue(i MOD j, i - ((i DIV j) * j), "-5 MOD 3"); m := cpumod(i, j); IF m < 0 THEN IF j < 0 THEN m := m - j ELSE m := m + j END END;
i := -6; j := 3; TestValue(i MOD j, i - ((i DIV j) * j), "-6 MOD 3"); TestValue(i MOD j, m, "-4 MOD 3");
i := -7; j := 3; TestValue(i MOD j, i - ((i DIV j) * j), "-7 MOD 3"); i := -5; j := 3;
m := cpumod(i, j); IF m < 0 THEN IF j < 0 THEN m := m - j ELSE m := m + j END END;
TestValue(i MOD j, m, "-5 MOD 3");
i := -6; j := 3;
m := cpumod(i, j); IF m < 0 THEN IF j < 0 THEN m := m - j ELSE m := m + j END END;
TestValue(i MOD j, m, "-6 MOD 3");
i := -7; j := 3;
m := cpumod(i, j); IF m < 0 THEN IF j < 0 THEN m := m - j ELSE m := m + j END END;
TestValue(i MOD j, m, "-7 MOD 3");
i := 4; j := -3; TestValue(i MOD j, i - ((i DIV j) * j), "4 MOD -3"); i := 4; j := -3;
i := 5; j := -3; TestValue(i MOD j, i - ((i DIV j) * j), "5 MOD -3"); m := cpumod(i, j); IF m < 0 THEN IF j < 0 THEN m := m - j ELSE m := m + j END END;
i := 6; j := -3; TestValue(i MOD j, i - ((i DIV j) * j), "6 MOD -3"); TestValue(i MOD j, m, "4 MOD -3");
i := 7; j := -3; TestValue(i MOD j, i - ((i DIV j) * j), "7 MOD -3"); i := 5; j := -3;
m := cpumod(i, j); IF m < 0 THEN IF j < 0 THEN m := m - j ELSE m := m + j END END;
TestValue(i MOD j, m, "5 MOD -3");
i := 6; j := -3;
m := cpumod(i, j); IF m < 0 THEN IF j < 0 THEN m := m - j ELSE m := m + j END END;
TestValue(i MOD j, m, "6 MOD -3");
i := 7; j := -3;
m := cpumod(i, j); IF m < 0 THEN IF j < 0 THEN m := m - j ELSE m := m + j END END;
TestValue(i MOD j, m, "7 MOD -3");
i := -4; j := -3; TestValue(i MOD j, i - ((i DIV j) * j), "-4 MOD -3"); i := -4; j := -3;
i := -5; j := -3; TestValue(i MOD j, i - ((i DIV j) * j), "-5 MOD -3"); m := cpumod(i, j); IF m < 0 THEN IF j < 0 THEN m := m - j ELSE m := m + j END END;
i := -6; j := -3; TestValue(i MOD j, i - ((i DIV j) * j), "-6 MOD -3"); TestValue(i MOD j, m, "-4 MOD -3");
i := -7; j := -3; TestValue(i MOD j, i - ((i DIV j) * j), "-7 MOD -3"); i := -5; j := -3;
m := cpumod(i, j); IF m < 0 THEN IF j < 0 THEN m := m - j ELSE m := m + j END END;
TestValue(i MOD j, m, "-5 MOD -3");
i := -6; j := -3;
m := cpumod(i, j); IF m < 0 THEN IF j < 0 THEN m := m - j ELSE m := m + j END END;
TestValue(i MOD j, m, "-6 MOD -3");
i := -7; j := -3;
m := cpumod(i, j); IF m < 0 THEN IF j < 0 THEN m := m - j ELSE m := m + j END END;
TestValue(i MOD j, m, "-7 MOD -3");
END DivMod; END DivMod;