function valuesAreClose(a, b) { return Math.abs(a / b) - 1 < 1e-10; } // Small exponent values are handled through a simpler inline loop. Test that it is not observable. function mathPowDoubleDoubleTestExponentFifty(x, y) { return Math.pow(x, y) } noInline(mathPowDoubleDoubleTestExponentFifty); function mathPowDoubleIntTestExponentFifty(x, y) { return Math.pow(x, y) } noInline(mathPowDoubleIntTestExponentFifty); function testExponentFifty(x, y, expected) { for (var i = 0; i < 10000; ++i) { var result = mathPowDoubleDoubleTestExponentFifty(x, y); if (!valuesAreClose(result, expected)) throw "Error: bad result, Math.pow(" + x + ", " + y + ") = " + result + " expected value close to " + expected; } var integerY = y | 0; for (var i = 0; i < 10000; ++i) { var result = mathPowDoubleIntTestExponentFifty(x, integerY); if (!valuesAreClose(result, expected)) throw "Error: bad result, Math.pow(" + x + ", " + integerY + ") = " + result + " expected value close to " + expected; } } noInline(testExponentFifty); testExponentFifty(53.70901164133102, 50.0, 3.179494118120144e+86); testExponentFifty(53.70901164133102, -10.0, 5.006432842621192e-18); function mathPowDoubleDoubleTestExponentTenThousands(x, y) { return Math.pow(x, y) } noInline(mathPowDoubleDoubleTestExponentTenThousands); function mathPowDoubleIntTestExponentTenThousands(x, y) { return Math.pow(x, y) } noInline(mathPowDoubleIntTestExponentTenThousands); function testExponentTenThousands(x, y, expected) { for (var i = 0; i < 10000; ++i) { var result = mathPowDoubleDoubleTestExponentTenThousands(x, y); if (!valuesAreClose(result, expected)) throw "Error: bad result, Math.pow(" + x + ", " + y + ") = " + result + " expected value close to " + expected; } var integerY = y | 0; for (var i = 0; i < 10000; ++i) { var result = mathPowDoubleIntTestExponentTenThousands(x, integerY); if (!valuesAreClose(result, expected)) throw "Error: bad result, Math.pow(" + x + ", " + integerY + ") = " + result + " expected value close to " + expected; } } noInline(testExponentTenThousands); testExponentTenThousands(1.001, 10000.0, 21916.681339048373); testExponentTenThousands(1.001, -1.0, 0.9990009990009991);