function exponentIsZero(x) { return x ** 0; } noInline(exponentIsZero); function testExponentIsZero() { for (var i = 0; i < 10000; ++i) { var result = exponentIsZero(5); if (result !== 1) throw "Error: zeroExponent(5) should be 1, was = " + result; } for (var i = 0; i < 10000; ++i) { var result = exponentIsZero(5.5); if (result !== 1) throw "Error: zeroExponent(5.5) should be 1, was = " + result; } } testExponentIsZero(); function exponentIsOne(x) { return x ** 1; } noInline(exponentIsOne); function testExponentIsOne() { for (var i = 0; i < 10000; ++i) { var result = exponentIsOne(5); if (result !== 5) throw "Error: exponentIsOne(5) should be 5, was = " + result; } for (var i = 0; i < 10000; ++i) { var result = exponentIsOne(5.5); if (result !== 5.5) throw "Error: exponentIsOne(5.5) should be 5.5, was = " + result; } } testExponentIsOne(); function powUsedAsSqrt(x) { return x ** 0.5; } noInline(powUsedAsSqrt); function testPowUsedAsSqrt() { for (let i = 0; i < 1e4; ++i) { let result = powUsedAsSqrt(4); if (result !== Math.sqrt(4)) throw "Error: powUsedAsSqrt(4) should be 2, was = " + result; result = powUsedAsSqrt(4.4); if (result !== Math.sqrt(4.4)) throw "Error: powUsedAsSqrt(4) should be " + Math.sqrt(4.4) + ", was = " + result; if (powUsedAsSqrt(Infinity) !== Infinity) throw "Failed powUsedAsSqrt(Infinity)"; if (powUsedAsSqrt(-Infinity) !== Infinity) throw "Failed powUsedAsSqrt(-Infinity)"; let nanResult = powUsedAsSqrt(NaN) if (nanResult === nanResult) throw "Failed powUsedAsSqrt(NaN)"; let zeroResult = powUsedAsSqrt(0.) if (zeroResult || (1 / zeroResult) !== Infinity) throw "Failed powUsedAsSqrt(0.)"; let negativeZeroResult = powUsedAsSqrt(-0) if (negativeZeroResult || (1 / negativeZeroResult) !== Infinity) throw "Failed powUsedAsSqrt(-0)"; } } testPowUsedAsSqrt(); function powUsedAsOneOverSqrt(x) { return x ** -0.5; } noInline(powUsedAsOneOverSqrt); function testPowUsedAsOneOverSqrt() { for (let i = 0; i < 1e4; ++i) { let result = powUsedAsOneOverSqrt(4); if (result !== 0.5) throw "Error: powUsedAsOneOverSqrt(4) should be 0.5, was = " + result; result = powUsedAsOneOverSqrt(4.4); if (result !== 1/Math.sqrt(4.4)) throw "Error: powUsedAsOneOverSqrt(4) should be " + 1/Math.sqrt(4.4) + ", was = " + result; if (powUsedAsOneOverSqrt(Infinity) !== 0) throw "Failed powUsedAsOneOverSqrt(Infinity)"; if (powUsedAsOneOverSqrt(-Infinity) !== 0) throw "Failed powUsedAsOneOverSqrt(-Infinity)"; let nanResult = powUsedAsOneOverSqrt(NaN) if (nanResult === nanResult) throw "Failed powUsedAsOneOverSqrt(NaN)"; if (powUsedAsOneOverSqrt(0) !== Infinity) throw "Failed powUsedAsOneOverSqrt(0)"; if (powUsedAsOneOverSqrt(-0.) !== Infinity) throw "Failed powUsedAsOneOverSqrt(-0.)"; } } testPowUsedAsOneOverSqrt(); function powUsedAsSquare(x) { return x ** 2; } noInline(powUsedAsSquare); function testPowUsedAsSquare() { for (let i = 0; i < 1e4; ++i) { let result = powUsedAsSquare(2); if (result !== 4) throw "Error: powUsedAsSquare(4) should be 2, was = " + result; result = powUsedAsSquare(4.4); if (result !== 19.360000000000003) throw "Error: powUsedAsSquare(4) should be " + 19.360000000000003 + ", was = " + result; result = powUsedAsSquare(Math.PI); if (result !== 9.869604401089358) throw "Error: powUsedAsSquare(4) should be " + 9.869604401089358 + ", was = " + result; if (powUsedAsSquare(Infinity) !== Infinity) throw "Failed powUsedAsSquare(Infinity)"; if (powUsedAsSquare(-Infinity) !== Infinity) throw "Failed powUsedAsSquare(-Infinity)"; let nanResult = powUsedAsSquare(NaN) if (nanResult === nanResult) throw "Failed powUsedAsSquare(NaN)"; let zeroResult = powUsedAsSquare(0.) if (zeroResult || (1 / zeroResult) !== Infinity) throw "Failed powUsedAsSquare(0.)"; let negativeZeroResult = powUsedAsSquare(-0) if (negativeZeroResult || (1 / negativeZeroResult) !== Infinity) throw "Failed powUsedAsSquare(-0)"; } } testPowUsedAsSquare(); function intIntConstantsSmallNumbers() { return 42 ** 3; } function intIntConstantsLargeNumbers() { // The result does not fit in a integer. return 42 ** 42; } function intIntSmallConstants() { return 42 ** 3; } function intDoubleConstants() { return 14 ** 42.5; } function doubleDoubleConstants() { return 13.5 ** 42.5; } function doubleIntConstants() { return 13.5 ** 52; } noInline(intIntConstantsSmallNumbers); noInline(intIntConstantsLargeNumbers); noInline(intDoubleConstants); noInline(doubleDoubleConstants); noInline(doubleIntConstants); function testBaseAndExponentConstantLiterals() { for (var i = 0; i < 10000; ++i) { var result = intIntConstantsSmallNumbers(); if (result !== 74088) throw "Error: intIntConstantsSmallNumbers() should be 74088, was = " + result; } for (var i = 0; i < 10000; ++i) { var result = intIntConstantsLargeNumbers(); if (result !== 1.5013093754529656e+68) throw "Error: intIntConstantsLargeNumbers() should be 1.5013093754529656e+68, was = " + result; } for (var i = 0; i < 10000; ++i) { var result = intDoubleConstants(); if (result !== 5.1338303882015765e+48) throw "Error: intDoubleConstants() should be 5.1338303882015765e+48, was = " + result; } for (var i = 0; i < 10000; ++i) { var result = doubleDoubleConstants(); if (result !== 1.0944228729647829e+48) throw "Error: doubleDoubleConstants() should be 1.0944228729647829e+48, was = " + result; } for (var i = 0; i < 10000; ++i) { var result = doubleIntConstants(); if (result !== 5.989022735311158e+58) throw "Error: doubleIntConstants() should be 5.989022735311158e+58, was = " + result; } } testBaseAndExponentConstantLiterals(); function exponentIsIntegerConstant(x) { return x ** 42; } noInline(exponentIsIntegerConstant); function testExponentIsIntegerConstant() { for (var i = 0; i < 1000; ++i) { var result = exponentIsIntegerConstant(2); if (result !== 4398046511104) throw "Error: exponentIsIntegerConstant(2) should be 4398046511104, was = " + result; } for (var i = 0; i < 1000; ++i) { var result = exponentIsIntegerConstant(5); if (result !== 2.2737367544323207e+29) throw "Error: exponentIsIntegerConstant(5) should be 2.2737367544323207e+29, was = " + result; } for (var i = 0; i < 1000; ++i) { var result = exponentIsIntegerConstant(2.1); if (result !== 34135823067412.42) throw "Error: exponentIsIntegerConstant(2.1) should be 34135823067412.42, was = " + result; } } testExponentIsIntegerConstant(); function exponentIsDoubleConstant(x) { return x ** 42.5; } noInline(exponentIsDoubleConstant); function testExponentIsDoubleConstant() { for (var i = 0; i < 1000; ++i) { var result = exponentIsDoubleConstant(2); if (result !== 6219777023950.95) throw "Error: exponentIsDoubleConstant(2) should be 6219777023950.95, was = " + result; } for (var i = 0; i < 1000; ++i) { var result = exponentIsDoubleConstant(5); if (result !== 5.084229945850415e+29) throw "Error: exponentIsDoubleConstant(5) should be 5.084229945850415e+29, was = " + result; } for (var i = 0; i < 1000; ++i) { var result = exponentIsDoubleConstant(2.1); if (result !== 49467507261113.805) throw "Error: exponentIsDoubleConstant(2.1) should be 49467507261113.805, was = " + result; } } testExponentIsDoubleConstant(); function exponentIsInfinityConstant(x) { return x ** Infinity; } noInline(exponentIsInfinityConstant); function testExponentIsInfinityConstant() { for (var i = 0; i < 1000; ++i) { var result = exponentIsInfinityConstant(2); if (result !== Infinity) throw "Error: exponentIsInfinityConstant(2) should be Infinity, was = " + result; } for (var i = 0; i < 1000; ++i) { var result = exponentIsInfinityConstant(5); if (result !== Infinity) throw "Error: exponentIsInfinityConstant(5) should be Infinity, was = " + result; } for (var i = 0; i < 1000; ++i) { var result = exponentIsInfinityConstant(2.1); if (result !== Infinity) throw "Error: exponentIsInfinityConstant(2.1) should be Infinity, was = " + result; } } testExponentIsInfinityConstant(); function exponentIsNegativeInfinityConstant(x) { return x ** -Infinity; } noInline(exponentIsNegativeInfinityConstant); function testExponentIsNegativeInfinityConstant() { for (var i = 0; i < 1000; ++i) { var result = exponentIsNegativeInfinityConstant(2); if (result !== 0) throw "Error: exponentIsNegativeInfinityConstant(2) should be zero, was = " + result; } for (var i = 0; i < 1000; ++i) { var result = exponentIsNegativeInfinityConstant(5); if (result !== 0) throw "Error: exponentIsNegativeInfinityConstant(5) should be zero, was = " + result; } for (var i = 0; i < 1000; ++i) { var result = exponentIsNegativeInfinityConstant(2.1); if (result !== 0) throw "Error: exponentIsNegativeInfinityConstant(2.1) should be zero, was = " + result; } } testExponentIsNegativeInfinityConstant();