JavaScriptCore:
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Oct 2007 14:12:30 +0000 (14:12 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Oct 2007 14:12:30 +0000 (14:12 +0000)
        Reviewed by Maciej.

        - fix http://bugs.webkit.org/show_bug.cgi?id=15639
          fix Math.abs(0), Math.ceil(-0), and Math.floor(-0)

        Test: fast/js/math.html

        * kjs/math_object.cpp: (MathFuncImp::callAsFunction):
        Fix abs to look at the sign bit. Add a special case for values in the range
        between -0 and -1 and a special case for ceil and for -0 for floor.

LayoutTests:

        Reviewed by Maciej.

        - test for http://bugs.webkit.org/show_bug.cgi?id=15639
          Math functions

        * fast/js/math-expected.txt: Added.
        * fast/js/math.html: Added.
        * fast/js/resources/math.js: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@26919 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/math_object.cpp
LayoutTests/ChangeLog
LayoutTests/fast/js/math-expected.txt [new file with mode: 0644]
LayoutTests/fast/js/math.html [new file with mode: 0644]
LayoutTests/fast/js/resources/math.js [new file with mode: 0644]

index fd296984ee89d296d97485997f4a18b07f3e26f9..d1e1770f34562eacfa323c0d0902949cd0753201 100644 (file)
@@ -1,3 +1,16 @@
+2007-10-23  Darin Adler  <darin@apple.com>
+
+        Reviewed by Maciej.
+
+        - fix http://bugs.webkit.org/show_bug.cgi?id=15639
+          fix Math.abs(0), Math.ceil(-0), and Math.floor(-0)
+
+        Test: fast/js/math.html
+
+        * kjs/math_object.cpp: (MathFuncImp::callAsFunction):
+        Fix abs to look at the sign bit. Add a special case for values in the range
+        between -0 and -1 and a special case for ceil and for -0 for floor.
+
 2007-10-23  Darin Adler  <darin@apple.com>
 
         Reviewed by Eric.
index 6676966824ba18f3e73d6b8b23d393fb583bfab7..50bd26de2c72e1daac1d7ac6254aa829d30e6662 100644 (file)
@@ -133,7 +133,7 @@ JSValue *MathFuncImp::callAsFunction(ExecState *exec, JSObject* /*thisObj*/, con
 
   switch (id) {
   case MathObjectImp::Abs:
-    result = ( arg < 0 || arg == -0) ? (-arg) : arg;
+    result = signbit(arg) ? -arg : arg;
     break;
   case MathObjectImp::ACos:
     result = acos(arg);
@@ -148,7 +148,10 @@ JSValue *MathFuncImp::callAsFunction(ExecState *exec, JSObject* /*thisObj*/, con
     result = atan2(arg, arg2);
     break;
   case MathObjectImp::Ceil:
-    result = ceil(arg);
+    if (signbit(arg) && arg > -1.0)
+      result = -0.0;
+    else
+      result = ceil(arg);
     break;
   case MathObjectImp::Cos:
     result = cos(arg);
@@ -157,7 +160,10 @@ JSValue *MathFuncImp::callAsFunction(ExecState *exec, JSObject* /*thisObj*/, con
     result = exp(arg);
     break;
   case MathObjectImp::Floor:
-    result = floor(arg);
+    if (signbit(arg) && arg == 0.0)
+      result = -0.0;
+    else
+      result = floor(arg);
     break;
   case MathObjectImp::Log:
     result = log(arg);
index 8409d635daa65693c54c85253264cb2fda6e2129..3d65bf9e27400d4d8dec5912db1e1063b0ef4899 100644 (file)
@@ -1,3 +1,14 @@
+2007-10-23  Darin Adler  <darin@apple.com>
+
+        Reviewed by Maciej.
+
+        - test for http://bugs.webkit.org/show_bug.cgi?id=15639
+          Math functions
+
+        * fast/js/math-expected.txt: Added.
+        * fast/js/math.html: Added.
+        * fast/js/resources/math.js: Added.
+
 2007-10-22  Eric Seidel  <eric@webkit.org>
 
         Reviewed by Maciej.
diff --git a/LayoutTests/fast/js/math-expected.txt b/LayoutTests/fast/js/math-expected.txt
new file mode 100644 (file)
index 0000000..983c9aa
--- /dev/null
@@ -0,0 +1,182 @@
+This test checks the behavior of the Math object as described in 15.8 of the language specification.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS Math.E is 2.718281828459045
+PASS Math.LN10 is 2.302585092994046
+PASS Math.LN2 is 0.6931471805599453
+PASS Math.LOG2E is 1.4426950408889634
+PASS Math.LOG10E is 0.43429448190325176
+PASS Math.PI is 3.141592653589793
+PASS Math.SQRT1_2 is 0.7071067811865476
+PASS Math.SQRT2 is 1.4142135623730951
+PASS Math.abs(NaN) is NaN
+PASS addSignToZero(Math.abs(+0)) is '+0'
+PASS addSignToZero(Math.abs(-0)) is '+0'
+PASS Math.abs(1) is 1
+PASS Math.abs(-1) is 1
+PASS Math.abs(Number.MIN_VALUE) is Number.MIN_VALUE
+PASS Math.abs(-Number.MIN_VALUE) is Number.MIN_VALUE
+PASS Math.abs(Number.MAX_VALUE) is Number.MAX_VALUE
+PASS Math.abs(-Number.MAX_VALUE) is Number.MAX_VALUE
+PASS Math.abs(Infinity) is Infinity
+PASS Math.abs(-Infinity) is Infinity
+PASS Math.acos(NaN) is NaN
+PASS Math.acos(+0) is 1.5707963267948966
+PASS Math.acos(-0) is 1.5707963267948966
+PASS addSignToZero(Math.acos(1)) is '+0'
+PASS Math.acos(-1) is 3.141592653589793
+PASS Math.acos(1.1) is NaN
+PASS Math.acos(-1.1) is NaN
+PASS Math.acos(Infinity) is NaN
+PASS Math.acos(-Infinity) is NaN
+PASS Math.asin(NaN) is NaN
+PASS addSignToZero(Math.asin(+0)) is '+0'
+PASS addSignToZero(Math.asin(-0)) is '-0'
+PASS Math.asin(1) is 1.5707963267948966
+PASS Math.asin(-1) is -1.5707963267948966
+PASS Math.asin(1.1) is NaN
+PASS Math.asin(-1.1) is NaN
+PASS Math.asin(Infinity) is NaN
+PASS Math.asin(-Infinity) is NaN
+PASS Math.atan(NaN) is NaN
+PASS addSignToZero(Math.atan(+0)) is '+0'
+PASS addSignToZero(Math.atan(-0)) is '-0'
+PASS Math.atan(1) is 0.7853981633974483
+PASS Math.atan(-1) is -0.7853981633974483
+PASS Math.atan(1.1) is 0.8329812666744316
+PASS Math.atan(-1.1) is -0.8329812666744316
+PASS Math.atan(Infinity) is 1.5707963267948966
+PASS Math.atan(-Infinity) is -1.5707963267948966
+PASS Math.atan2(NaN, NaN) is NaN
+PASS Math.atan2(NaN, +0) is NaN
+PASS Math.atan2(NaN, -0) is NaN
+PASS Math.atan2(NaN, 1) is NaN
+PASS Math.atan2(NaN, Infinity) is NaN
+PASS Math.atan2(NaN, -Infinity) is NaN
+PASS Math.atan2(+0, NaN) is NaN
+PASS Math.atan2(-0, NaN) is NaN
+PASS Math.atan2(1, NaN) is NaN
+PASS Math.atan2(Infinity, NaN) is NaN
+PASS Math.atan2(-Infinity, NaN) is NaN
+PASS Math.ceil(NaN) is NaN
+PASS addSignToZero(Math.ceil(+0)) is '+0'
+PASS addSignToZero(Math.ceil(-0)) is '-0'
+PASS addSignToZero(Math.ceil(-0.5)) is '-0'
+PASS Math.ceil(1) is 1
+PASS Math.ceil(-1) is -1
+PASS Math.ceil(1.1) is 2
+PASS Math.ceil(-1.1) is -1
+PASS Math.ceil(Number.MIN_VALUE) is 1
+PASS addSignToZero(Math.ceil(-Number.MIN_VALUE)) is '-0'
+PASS Math.ceil(Number.MAX_VALUE) is Number.MAX_VALUE
+PASS Math.ceil(-Number.MAX_VALUE) is -Number.MAX_VALUE
+PASS Math.ceil(Infinity) is Infinity
+PASS Math.ceil(-Infinity) is -Infinity
+PASS Math.cos(NaN) is NaN
+PASS Math.cos(+0) is 1
+PASS Math.cos(-0) is 1
+PASS Math.cos(1) is 0.5403023058681398
+PASS Math.cos(-1) is 0.5403023058681398
+PASS Math.cos(Infinity) is NaN
+PASS Math.cos(-Infinity) is NaN
+PASS Math.exp(NaN) is NaN
+PASS Math.exp(+0) is 1
+PASS Math.exp(-0) is 1
+PASS Math.exp(1) is 2.718281828459045
+PASS Math.exp(-1) is 0.36787944117144233
+PASS Math.exp(1.1) is 3.0041660239464334
+PASS Math.exp(-1.1) is 0.33287108369807955
+PASS Math.exp(Infinity) is Infinity
+PASS addSignToZero(Math.exp(-Infinity)) is '+0'
+PASS Math.floor(NaN) is NaN
+PASS addSignToZero(Math.floor(+0)) is '+0'
+PASS addSignToZero(Math.floor(-0)) is '-0'
+PASS addSignToZero(Math.floor(0.5)) is '+0'
+PASS Math.floor(1) is 1
+PASS Math.floor(-1) is -1
+PASS Math.floor(1.1) is 1
+PASS Math.floor(-1.1) is -2
+PASS addSignToZero(Math.floor(Number.MIN_VALUE)) is '+0'
+PASS Math.floor(-Number.MIN_VALUE) is -1
+PASS Math.floor(Number.MAX_VALUE) is Number.MAX_VALUE
+PASS Math.floor(-Number.MAX_VALUE) is -Number.MAX_VALUE
+PASS Math.floor(Infinity) is Infinity
+PASS Math.floor(-Infinity) is -Infinity
+PASS Math.log(NaN) is NaN
+PASS Math.log(+0) is -Infinity
+PASS Math.log(-0) is -Infinity
+PASS addSignToZero(Math.log(1)) is '+0'
+PASS Math.log(-1) is NaN
+PASS Math.log(1.1) is 0.09531017980432493
+PASS Math.log(-1.1) is NaN
+PASS Math.log(Infinity) is Infinity
+PASS Math.log(-Infinity) is NaN
+PASS Math.max() is -Infinity
+PASS Math.max(NaN) is NaN
+PASS Math.max(NaN,1) is NaN
+PASS addSignToZero(Math.max(+0)) is '+0'
+PASS addSignToZero(Math.max(-0)) is '-0'
+PASS addSignToZero(Math.max(-0,+0)) is '+0'
+PASS Math.min() is Infinity
+PASS Math.min(NaN) is NaN
+PASS Math.min(NaN,1) is NaN
+PASS addSignToZero(Math.min(+0)) is '+0'
+PASS addSignToZero(Math.min(-0)) is '-0'
+PASS addSignToZero(Math.min(-0,+0)) is '-0'
+PASS Math.pow(NaN, NaN) is NaN
+PASS addSignToZero(Math.pow(NaN, +0)) is 1
+PASS addSignToZero(Math.pow(NaN, -0)) is 1
+PASS Math.pow(NaN, 1) is NaN
+PASS Math.pow(NaN, Infinity) is NaN
+PASS Math.pow(NaN, -Infinity) is NaN
+PASS Math.pow(+0, NaN) is NaN
+PASS Math.pow(-0, NaN) is NaN
+PASS Math.pow(1, NaN) is NaN
+PASS Math.pow(Infinity, NaN) is NaN
+PASS Math.pow(-Infinity, NaN) is NaN
+PASS Math.round(NaN) is NaN
+PASS addSignToZero(Math.round(+0)) is '+0'
+PASS addSignToZero(Math.round(-0)) is '-0'
+PASS addSignToZero(Math.round(0.4)) is '+0'
+PASS addSignToZero(Math.round(-0.4)) is '-0'
+PASS Math.round(0.5) is 1
+PASS addSignToZero(Math.round(-0.5)) is '-0'
+PASS Math.round(0.6) is 1
+PASS Math.round(-0.6) is -1
+PASS Math.round(1) is 1
+PASS Math.round(-1) is -1
+PASS Math.round(1.1) is 1
+PASS Math.round(-1.1) is -1
+PASS Math.round(1.5) is 2
+PASS Math.round(-1.5) is -1
+PASS Math.round(1.6) is 2
+PASS Math.round(-1.6) is -2
+PASS Math.round(Infinity) is Infinity
+PASS Math.round(-Infinity) is -Infinity
+PASS Math.sin(NaN) is NaN
+PASS addSignToZero(Math.sin(+0)) is '+0'
+PASS addSignToZero(Math.sin(-0)) is '-0'
+PASS Math.sin(1) is 0.8414709848078965
+PASS Math.sin(-1) is -0.8414709848078965
+PASS Math.sin(Infinity) is NaN
+PASS Math.sin(-Infinity) is NaN
+PASS Math.sqrt(NaN) is NaN
+PASS addSignToZero(Math.sqrt(+0)) is '+0'
+PASS addSignToZero(Math.sqrt(-0)) is '-0'
+PASS Math.sqrt(1) is 1
+PASS Math.sqrt(-1) is NaN
+PASS Math.sqrt(Infinity) is Infinity
+PASS Math.sqrt(-Infinity) is NaN
+PASS Math.tan(NaN) is NaN
+PASS addSignToZero(Math.tan(+0)) is '+0'
+PASS addSignToZero(Math.tan(-0)) is '-0'
+PASS Math.tan(1) is 1.5574077246549023
+PASS Math.tan(-1) is -1.5574077246549023
+PASS Math.tan(Infinity) is NaN
+PASS Math.tan(-Infinity) is NaN
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/js/math.html b/LayoutTests/fast/js/math.html
new file mode 100644 (file)
index 0000000..4781e81
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="resources/js-test-style.css">
+<script src="resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="resources/math.js"></script>
+<script src="resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/js/resources/math.js b/LayoutTests/fast/js/resources/math.js
new file mode 100644 (file)
index 0000000..af90a53
--- /dev/null
@@ -0,0 +1,256 @@
+description(
+
+"This test checks the behavior of the Math object as described in 15.8 of the language specification."
+
+);
+
+shouldBe("Math.E", "2.718281828459045");
+shouldBe("Math.LN10", "2.302585092994046");
+shouldBe("Math.LN2", "0.6931471805599453");
+shouldBe("Math.LOG2E", "1.4426950408889634");
+shouldBe("Math.LOG10E", "0.43429448190325176");
+shouldBe("Math.PI", "3.141592653589793");
+shouldBe("Math.SQRT1_2", "0.7071067811865476");
+shouldBe("Math.SQRT2", "1.4142135623730951");
+
+function addSignToZero(n)
+{
+    if (n != 0)
+        return n;
+    if (1 / n == Infinity)
+        return "+0";
+    if (1 / n == -Infinity)
+        return "-0";
+    return "???";
+}
+
+shouldBe("Math.abs(NaN)", "NaN");
+shouldBe("addSignToZero(Math.abs(+0))", "'+0'");
+shouldBe("addSignToZero(Math.abs(-0))", "'+0'");
+shouldBe("Math.abs(1)", "1");
+shouldBe("Math.abs(-1)", "1");
+shouldBe("Math.abs(Number.MIN_VALUE)", "Number.MIN_VALUE");
+shouldBe("Math.abs(-Number.MIN_VALUE)", "Number.MIN_VALUE");
+shouldBe("Math.abs(Number.MAX_VALUE)", "Number.MAX_VALUE");
+shouldBe("Math.abs(-Number.MAX_VALUE)", "Number.MAX_VALUE");
+shouldBe("Math.abs(Infinity)", "Infinity");
+shouldBe("Math.abs(-Infinity)", "Infinity");
+
+shouldBe("Math.acos(NaN)", "NaN");
+shouldBe("Math.acos(+0)", "1.5707963267948966");
+shouldBe("Math.acos(-0)", "1.5707963267948966");
+shouldBe("addSignToZero(Math.acos(1))", "'+0'");
+shouldBe("Math.acos(-1)", "3.141592653589793");
+shouldBe("Math.acos(1.1)", "NaN");
+shouldBe("Math.acos(-1.1)", "NaN");
+shouldBe("Math.acos(Infinity)", "NaN");
+shouldBe("Math.acos(-Infinity)", "NaN");
+
+shouldBe("Math.asin(NaN)", "NaN");
+shouldBe("addSignToZero(Math.asin(+0))", "'+0'");
+shouldBe("addSignToZero(Math.asin(-0))", "'-0'");
+shouldBe("Math.asin(1)", "1.5707963267948966");
+shouldBe("Math.asin(-1)", "-1.5707963267948966");
+shouldBe("Math.asin(1.1)", "NaN");
+shouldBe("Math.asin(-1.1)", "NaN");
+shouldBe("Math.asin(Infinity)", "NaN");
+shouldBe("Math.asin(-Infinity)", "NaN");
+
+shouldBe("Math.atan(NaN)", "NaN");
+shouldBe("addSignToZero(Math.atan(+0))", "'+0'");
+shouldBe("addSignToZero(Math.atan(-0))", "'-0'");
+shouldBe("Math.atan(1)", "0.7853981633974483");
+shouldBe("Math.atan(-1)", "-0.7853981633974483");
+shouldBe("Math.atan(1.1)", "0.8329812666744316");
+shouldBe("Math.atan(-1.1)", "-0.8329812666744316");
+shouldBe("Math.atan(Infinity)", "1.5707963267948966");
+shouldBe("Math.atan(-Infinity)", "-1.5707963267948966");
+
+shouldBe("Math.atan2(NaN, NaN)", "NaN");
+shouldBe("Math.atan2(NaN, +0)", "NaN");
+shouldBe("Math.atan2(NaN, -0)", "NaN");
+shouldBe("Math.atan2(NaN, 1)", "NaN");
+shouldBe("Math.atan2(NaN, Infinity)", "NaN");
+shouldBe("Math.atan2(NaN, -Infinity)", "NaN");
+shouldBe("Math.atan2(+0, NaN)", "NaN");
+shouldBe("Math.atan2(-0, NaN)", "NaN");
+shouldBe("Math.atan2(1, NaN)", "NaN");
+shouldBe("Math.atan2(Infinity, NaN)", "NaN");
+shouldBe("Math.atan2(-Infinity, NaN)", "NaN");
+
+/*
+• Ify>0andxis+0, theresult isanimplementation-dependent approximationto +π/2. 
+• Ify>0andxis−0, theresult isanimplementation-dependent approximationto +π/2. 
+• Ifyis+0andx>0, theresult is+0. 
+• Ifyis+0andxis+0, theresult is+0. 
+• Ifyis+0andxis−0, theresult isanimplementation-dependent approximationto +π. 
+• Ifyis+0andx<0, theresult isanimplementation-dependent approximationto +π. 
+• Ifyis−0andx>0, theresult is−0. 
+• Ifyis−0andxis+0, theresult is−0. 
+• Ifyis−0andxis−0, theresult isanimplementation-dependent approximationto −π. 
+• Ifyis−0andx<0, theresult isanimplementation-dependent approximationto −π. 
+• Ify<0andxis+0, theresult isanimplementation-dependent approximationto −π/2. 
+• Ify<0andxis−0, theresult isanimplementation-dependent approximationto −π/2. 
+• Ify>0andyisfiniteandxis+∞, theresult is+0. 
+• Ify>0andyisfiniteandxis−∞, theresult ifanimplementation-dependent approximationto +π. 
+• Ify<0andyisfiniteandxis+∞, theresult is−0. 
+• Ify<0andyisfiniteandxis−∞, theresult isanimplementation-dependent approximationto−π. 
+• Ifyis+∞andxisfinite, theresult isanimplementation-dependent approximationto +π/2. 
+• Ifyis−∞andxisfinite, theresult isanimplementation-dependent approximationto −π/2. 
+• Ifyis+∞andxis+∞, theresult isanimplementation-dependent approximationto +π/4. 
+• Ifyis+∞andxis−∞, theresult isanimplementation-dependent approximationto +3π/4. 
+• Ifyis−∞andxis+∞, theresult isanimplementation-dependent approximationto −π/4. 
+• Ifyis−∞andxis−∞, theresult isanimplementation-dependent approximationto −3π/4.
+*/
+
+shouldBe("Math.ceil(NaN)", "NaN");
+shouldBe("addSignToZero(Math.ceil(+0))", "'+0'");
+shouldBe("addSignToZero(Math.ceil(-0))", "'-0'");
+shouldBe("addSignToZero(Math.ceil(-0.5))", "'-0'");
+shouldBe("Math.ceil(1)", "1");
+shouldBe("Math.ceil(-1)", "-1");
+shouldBe("Math.ceil(1.1)", "2");
+shouldBe("Math.ceil(-1.1)", "-1");
+shouldBe("Math.ceil(Number.MIN_VALUE)", "1");
+shouldBe("addSignToZero(Math.ceil(-Number.MIN_VALUE))", "'-0'");
+shouldBe("Math.ceil(Number.MAX_VALUE)", "Number.MAX_VALUE");
+shouldBe("Math.ceil(-Number.MAX_VALUE)", "-Number.MAX_VALUE");
+shouldBe("Math.ceil(Infinity)", "Infinity");
+shouldBe("Math.ceil(-Infinity)", "-Infinity");
+
+shouldBe("Math.cos(NaN)", "NaN");
+shouldBe("Math.cos(+0)", "1");
+shouldBe("Math.cos(-0)", "1");
+shouldBe("Math.cos(1)", "0.5403023058681398");
+shouldBe("Math.cos(-1)", "0.5403023058681398");
+shouldBe("Math.cos(Infinity)", "NaN");
+shouldBe("Math.cos(-Infinity)", "NaN");
+
+shouldBe("Math.exp(NaN)", "NaN");
+shouldBe("Math.exp(+0)", "1");
+shouldBe("Math.exp(-0)", "1");
+shouldBe("Math.exp(1)", "2.718281828459045");
+shouldBe("Math.exp(-1)", "0.36787944117144233");
+shouldBe("Math.exp(1.1)", "3.0041660239464334");
+shouldBe("Math.exp(-1.1)", "0.33287108369807955");
+shouldBe("Math.exp(Infinity)", "Infinity");
+shouldBe("addSignToZero(Math.exp(-Infinity))", "'+0'");
+
+shouldBe("Math.floor(NaN)", "NaN");
+shouldBe("addSignToZero(Math.floor(+0))", "'+0'");
+shouldBe("addSignToZero(Math.floor(-0))", "'-0'");
+shouldBe("addSignToZero(Math.floor(0.5))", "'+0'");
+shouldBe("Math.floor(1)", "1");
+shouldBe("Math.floor(-1)", "-1");
+shouldBe("Math.floor(1.1)", "1");
+shouldBe("Math.floor(-1.1)", "-2");
+shouldBe("addSignToZero(Math.floor(Number.MIN_VALUE))", "'+0'");
+shouldBe("Math.floor(-Number.MIN_VALUE)", "-1");
+shouldBe("Math.floor(Number.MAX_VALUE)", "Number.MAX_VALUE");
+shouldBe("Math.floor(-Number.MAX_VALUE)", "-Number.MAX_VALUE");
+shouldBe("Math.floor(Infinity)", "Infinity");
+shouldBe("Math.floor(-Infinity)", "-Infinity");
+
+shouldBe("Math.log(NaN)", "NaN");
+shouldBe("Math.log(+0)", "-Infinity");
+shouldBe("Math.log(-0)", "-Infinity");
+shouldBe("addSignToZero(Math.log(1))", "'+0'");
+shouldBe("Math.log(-1)", "NaN");
+shouldBe("Math.log(1.1)", "0.09531017980432493");
+shouldBe("Math.log(-1.1)", "NaN");
+shouldBe("Math.log(Infinity)", "Infinity");
+shouldBe("Math.log(-Infinity)", "NaN");
+
+shouldBe("Math.max()", "-Infinity");
+shouldBe("Math.max(NaN)", "NaN");
+shouldBe("Math.max(NaN,1)", "NaN");
+shouldBe("addSignToZero(Math.max(+0))", "'+0'");
+shouldBe("addSignToZero(Math.max(-0))", "'-0'");
+shouldBe("addSignToZero(Math.max(-0,+0))", "'+0'");
+
+shouldBe("Math.min()", "Infinity");
+shouldBe("Math.min(NaN)", "NaN");
+shouldBe("Math.min(NaN,1)", "NaN");
+shouldBe("addSignToZero(Math.min(+0))", "'+0'");
+shouldBe("addSignToZero(Math.min(-0))", "'-0'");
+shouldBe("addSignToZero(Math.min(-0,+0))", "'-0'");
+
+shouldBe("Math.pow(NaN, NaN)", "NaN");
+shouldBe("addSignToZero(Math.pow(NaN, +0))", "1");
+shouldBe("addSignToZero(Math.pow(NaN, -0))", "1");
+shouldBe("Math.pow(NaN, 1)", "NaN");
+shouldBe("Math.pow(NaN, Infinity)", "NaN");
+shouldBe("Math.pow(NaN, -Infinity)", "NaN");
+shouldBe("Math.pow(+0, NaN)", "NaN");
+shouldBe("Math.pow(-0, NaN)", "NaN");
+shouldBe("Math.pow(1, NaN)", "NaN");
+shouldBe("Math.pow(Infinity, NaN)", "NaN");
+shouldBe("Math.pow(-Infinity, NaN)", "NaN");
+
+/*
+• Ifabs(x)>1andyis+∞, theresult is+∞. 
+• Ifabs(x)>1andyis−∞, theresult is+0. 
+• Ifabs(x)==1andyis+∞, theresult isNaN. 
+• Ifabs(x)==1andyis−∞, theresult isNaN. 
+• Ifabs(x)<1andyis+∞, theresult is+0. 
+• Ifabs(x)<1andyis−∞, theresult is+∞. 
+• Ifxis+∞andy>0, theresult is+∞. 
+• Ifxis+∞andy<0, theresult is+0. 
+• Ifxis−∞andy>0andyisanoddinteger, theresult is−∞. 
+• Ifxis−∞andy>0andyisnot anoddinteger, theresult is+∞. 
+• Ifxis−∞andy<0andyisanoddinteger, theresult is−0. 
+• Ifxis−∞andy<0andyisnot anoddinteger, theresult is+0. 
+• Ifxis+0andy>0, theresult is+0. 
+• Ifxis+0andy<0, theresult is+∞. 
+• Ifxis−0andy>0andyisanoddinteger, theresult is−0. 
+• Ifxis−0andy>0andyisnot anoddinteger, theresult is+0. 
+• Ifxis−0andy<0andyisanoddinteger, theresult is−∞. 
+• Ifxis−0andy<0andyisnot anoddinteger, theresult is+∞. 
+• Ifx<0andxisfiniteandyisfiniteandyisnot aninteger, theresult isNaN.
+*/
+
+shouldBe("Math.round(NaN)", "NaN");
+shouldBe("addSignToZero(Math.round(+0))", "'+0'");
+shouldBe("addSignToZero(Math.round(-0))", "'-0'");
+shouldBe("addSignToZero(Math.round(0.4))", "'+0'");
+shouldBe("addSignToZero(Math.round(-0.4))", "'-0'");
+shouldBe("Math.round(0.5)", "1");
+shouldBe("addSignToZero(Math.round(-0.5))", "'-0'");
+shouldBe("Math.round(0.6)", "1");
+shouldBe("Math.round(-0.6)", "-1");
+shouldBe("Math.round(1)", "1");
+shouldBe("Math.round(-1)", "-1");
+shouldBe("Math.round(1.1)", "1");
+shouldBe("Math.round(-1.1)", "-1");
+shouldBe("Math.round(1.5)", "2");
+shouldBe("Math.round(-1.5)", "-1");
+shouldBe("Math.round(1.6)", "2");
+shouldBe("Math.round(-1.6)", "-2");
+shouldBe("Math.round(Infinity)", "Infinity");
+shouldBe("Math.round(-Infinity)", "-Infinity");
+
+shouldBe("Math.sin(NaN)", "NaN");
+shouldBe("addSignToZero(Math.sin(+0))", "'+0'");
+shouldBe("addSignToZero(Math.sin(-0))", "'-0'");
+shouldBe("Math.sin(1)", "0.8414709848078965");
+shouldBe("Math.sin(-1)", "-0.8414709848078965");
+shouldBe("Math.sin(Infinity)", "NaN");
+shouldBe("Math.sin(-Infinity)", "NaN");
+
+shouldBe("Math.sqrt(NaN)", "NaN");
+shouldBe("addSignToZero(Math.sqrt(+0))", "'+0'");
+shouldBe("addSignToZero(Math.sqrt(-0))", "'-0'");
+shouldBe("Math.sqrt(1)", "1");
+shouldBe("Math.sqrt(-1)", "NaN");
+shouldBe("Math.sqrt(Infinity)", "Infinity");
+shouldBe("Math.sqrt(-Infinity)", "NaN");
+
+shouldBe("Math.tan(NaN)", "NaN");
+shouldBe("addSignToZero(Math.tan(+0))", "'+0'");
+shouldBe("addSignToZero(Math.tan(-0))", "'-0'");
+shouldBe("Math.tan(1)", "1.5574077246549023");
+shouldBe("Math.tan(-1)", "-1.5574077246549023");
+shouldBe("Math.tan(Infinity)", "NaN");
+shouldBe("Math.tan(-Infinity)", "NaN");
+
+successfullyParsed = true;