mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-06 06:22:25 +00:00
fixed the remainder issue: should not be negative.
This commit is contained in:
parent
cfa8aa2c39
commit
daa6601c56
2 changed files with 46 additions and 20 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue