| //------------------------------------------------------------------------------------------------------- |
| // Copyright (C) Microsoft. All rights reserved. |
| // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. |
| //------------------------------------------------------------------------------------------------------- |
| |
| var FAILED = false; |
| |
| // check rounding of NaN |
| checknan(Math.round(NaN), "Math.round(NaN)"); |
| checknan(Math.round(Math.asin(2.0)), "Math.round(Math.asin(2.0))"); |
| |
| // check rounding of Infinity |
| check(Infinity, Math.round(Infinity), "Math.round(Infinity)"); |
| check(-Infinity, Math.round(-Infinity), "Math.round(-Infinity)"); |
| |
| // check positive and negative 0 |
| //check(0, Math.round(+0), "Math.round(+0)"); |
| check(-0, Math.round(-0), "Math.round(-0)"); |
| |
| // check various values between 0 and 0.5 |
| check(0, Math.round(4.9999999999999994000e-001), "round largest value < 0.5"); // for ES5 the result is 0 |
| check(0, Math.round(4.9999999999999989000e-001), "round 2nd largest value < 0.5"); |
| check(0, Math.round(4.9406564584124654000e-324), "round smallest value > 0"); |
| check(0, Math.round(9.8813129168249309000e-324), "round 2nd smallest value > 0"); |
| for(var i = 0.001; i < 0.5; i += 0.001) |
| { |
| check(0, Math.round(i), "round " + i); |
| } |
| |
| // check various values between -0.5 and 0 |
| checkisnegativezero(Math.round(-4.9406564584124654000e-324), "round most positive value < 0"); |
| checkisnegativezero(Math.round(-9.8813129168249309000e-324), "round 2nd most positive value < 0"); |
| checkisnegativezero(Math.round(-4.9999999999999994000e-001), "round most negative value > -0.5"); |
| checkisnegativezero(Math.round(-4.9999999999999989000e-001), "round 2nd most negative value > -0.5"); |
| checkisnegativezero(Math.round(-0), "round -0 should be -0"); |
| |
| for(var i = -0.001; i > -0.5; i -= 0.001) |
| { |
| checkisnegativezero(Math.round(i), "round " + i); |
| } |
| |
| // check various integers |
| check(1, Math.round(1), "round 1"); |
| check(2, Math.round(2), "round 2"); |
| check(-1, Math.round(-1), "round -1"); |
| check(-2, Math.round(-2), "round -2"); |
| check(4294967295, Math.round(4294967295), "round 4294967295"); |
| check(4294967296, Math.round(4294967296), "round 4294967296"); |
| check(-4294967296, Math.round(-4294967296), "round -4294967296"); |
| for(var i = 1000; i < 398519; i += 179) |
| { |
| check(i, Math.round(i), "round " + i); |
| } |
| for(var i = 0.001; i <= 0.5; i += 0.001) |
| { |
| check(1, Math.round(0.5 + i), "round " + (0.5+i)); |
| } |
| for(var i = -0.001; i >= -0.5; i -= 0.001) |
| { |
| check(-1, Math.round(-0.5 + i), "round " + (-0.5+i)); |
| } |
| |
| // check I + 0.5 |
| check(1, Math.round(0.5), "round 0.5"); |
| check(2, Math.round(1.5), "round 1.5"); |
| check(3, Math.round(2.5), "round 2.5"); |
| check(4294967296, Math.round(4294967295 + 0.5), "round 4294967295.5"); |
| for(var i = -100000; i <= 100000; i += 100) |
| { |
| check(i+1, Math.round(i + 0.5), "round " + (i+0.5)); |
| } |
| |
| // miscellaneous other real numbers |
| check(30593859183, Math.round(30593859183.3915898), "round a double with high precision"); |
| check(1, Math.round(5.0000000000000011000e-001), "round smallest value > 0.5"); |
| check(1, Math.round(5.0000000000000022000e-001), "round 2nd smallest value > 0.5"); |
| check(1.7976931348623157000e+308, Math.round(1.7976931348623157000e+308), "round largest number < Infinity"); |
| check(1.7976931348623155000e+308, Math.round(1.7976931348623155000e+308), "round 2nd largest number < Infinity"); |
| check(-1.7976931348623157000e+308, Math.round(-1.7976931348623157000e+308), "round least positive number > -Infinity"); |
| check(-1.7976931348623155000e+308, Math.round(-1.7976931348623155000e+308), "round 2nd least positive number > -Infinity"); |
| |
| +// if x <= -2^52 or x >= 2^52, Math.round(x) == x |
| +check(4503599627370496, Math.round(4503599627370496), "round 4503599627370496"); |
| +check(4503599627370497, Math.round(4503599627370497), "round 4503599627370497"); |
| +check(4503599627370548, Math.round(4503599627370548), "round 4503599627370548"); |
| +check(9007199254740991, Math.round(9007199254740991), "round 9007199254740991"); |
| +check(-4503599627370496, Math.round(-4503599627370496), "round -4503599627370496"); |
| +check(-4503599627370497, Math.round(-4503599627370497), "round -4503599627370497"); |
| +check(-4503599627370548, Math.round(-4503599627370548), "round -4503599627370548"); |
| +check(-9007199254740991, Math.round(-9007199254740991), "round -9007199254740991"); |
| |
| // values around INT_MIN and INT_MAX for amd64 (Bug 179932) |
| function foo(b) |
| { |
| var round = Math.round(b); |
| |
| if(round <= 2147483647) |
| { |
| FAILED = true; |
| } |
| } |
| foo(2147483648); |
| |
| function bar(b) |
| { |
| var round = Math.round(b); |
| |
| if(round >= -2147483648) |
| { |
| FAILED = true; |
| } |
| } |
| bar(-2147483649); |
| |
| if (!FAILED) |
| { |
| WScript.Echo("Passed"); |
| } |
| |
| function check(x, y, str) |
| { |
| if(x != y) |
| { |
| FAILED = true; |
| WScript.Echo("fail: " + str); |
| } |
| } |
| function checkisnegativezero(x, str) |
| { |
| // this is a quick way to check if a number is -0 |
| if(x != 0 || 1/x >= 0) |
| { |
| FAILED = true; |
| WScript.Echo("fail: " + str); |
| } |
| } |
| function checknan(x, str) |
| { |
| if(!isNaN(x)) |
| { |
| FAILED = true; |
| WScript.Echo("fail: " + str); |
| } |
| } |