| Index: test/mjsunit/div-mod.js
|
| diff --git a/test/mjsunit/div-mod.js b/test/mjsunit/div-mod.js
|
| index a8a19b30c139b22d9f888aa4b90a0b9fdda87534..b3c77e1da728c5ae082d3ab39246160bb082568a 100644
|
| --- a/test/mjsunit/div-mod.js
|
| +++ b/test/mjsunit/div-mod.js
|
| @@ -86,3 +86,72 @@ var divisors = [
|
| for (var i = 0; i < divisors.length; i++) {
|
| run_tests_for(divisors[i]);
|
| }
|
| +
|
| +// Test extreme corner cases of modulo.
|
| +
|
| +// Computes the modulo by slow but lossless operations.
|
| +function compute_mod(dividend, divisor) {
|
| + // Return NaN if either operand is NaN, if divisor is 0 or
|
| + // dividend is an infinity. Return dividend if divisor is an infinity.
|
| + if (isNaN(dividend) || isNaN(divisor) || divisor == 0) { return NaN; }
|
| + var sign = 1;
|
| + if (dividend < 0) { dividend = -dividend; sign = -1; }
|
| + if (dividend == Infinity) { return NaN; }
|
| + if (divisor < 0) { divisor = -divisor; }
|
| + if (divisor == Infinity) { return sign * dividend; }
|
| + function rec_mod(a, b) {
|
| + // Subtracts maximal possible multiplum of b from a.
|
| + if (a >= b) {
|
| + a = rec_mod(a, 2 * b);
|
| + if (a >= b) { a -= b; }
|
| + }
|
| + return a;
|
| + }
|
| + return sign * rec_mod(dividend, divisor);
|
| +}
|
| +
|
| +(function () {
|
| + var large_non_smi = 1234567891234.12245;
|
| + var small_non_smi = 43.2367243;
|
| + var repeating_decimal = 0.3;
|
| + var finite_decimal = 0.5;
|
| + var smi = 43;
|
| + var power_of_two = 64;
|
| + var min_normal = Number.MIN_VALUE * Math.pow(2, 52);
|
| + var max_denormal = Number.MIN_VALUE * (Math.pow(2, 52) - 1);
|
| +
|
| + // All combinations of NaN, Infinity, normal, denormal and zero.
|
| + var example_numbers = [
|
| + NaN,
|
| + 0,
|
| + Number.MIN_VALUE,
|
| + 3 * Number.MIN_VALUE,
|
| + max_denormal,
|
| + min_normal,
|
| + repeating_decimal,
|
| + finite_decimal,
|
| + smi,
|
| + power_of_two,
|
| + small_non_smi,
|
| + large_non_smi,
|
| + Number.MAX_VALUE,
|
| + Infinity
|
| + ];
|
| +
|
| + function doTest(a, b) {
|
| + var exp = compute_mod(a, b);
|
| + var act = a % b;
|
| + assertEquals(exp, act, a + " % " + b);
|
| + }
|
| +
|
| + for (var i = 0; i < example_numbers.length; i++) {
|
| + for (var j = 0; j < example_numbers.length; j++) {
|
| + var a = example_numbers[i];
|
| + var b = example_numbers[j];
|
| + doTest(a,b);
|
| + doTest(-a,b);
|
| + doTest(a,-b);
|
| + doTest(-a,-b);
|
| + }
|
| + }
|
| +})()
|
|
|