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)
{
if (x == 0) return 0;
if (x >= 0)
if (y >= 0) {return x % y;}
else {return (y+1) + ((x-1) % (-y));}
else
if (y >= 0) {return (y-1) - ((-x-1) % y);}
else {return -((-x) % (-y));}
if (x == 0) {return 0;}
INT64 m = x % y;
if (m < 0)
{
m = (y < 0) ? m - y : m + y;
}
return m;
}
INT64 SYSTEM_ENTIER(double x)

View file

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