Implement missing Math logarithm functions from ES6 (#3617)

Math.log2, Math.log10, Math.log1p, Math.expm1

C implementation ported from fdlibm

Part of Issue #3568

JerryScript-DCO-1.0-Signed-off-by: Rafal Walczyna r.walczyna@samsung.com
This commit is contained in:
Rafal Walczyna
2020-04-04 02:00:41 +02:00
committed by GitHub
parent c74256ccba
commit e470b13096
13 changed files with 1124 additions and 16 deletions
+31
View File
@@ -0,0 +1,31 @@
// Copyright JS Foundation and other contributors, http://js.foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
var p_zero = 0.0;
var n_zero = -p_zero;
function isSameZero (x, y)
{
return x === 0 && (1 / x) === (1 / y);
}
assert(isNaN(Math.expm1(NaN)));
assert(isSameZero(Math.expm1(p_zero), p_zero));
assert(isSameZero(Math.expm1(n_zero), n_zero));
assert(Math.expm1(Number.POSITIVE_INFINITY) === Number.POSITIVE_INFINITY);
assert(Math.expm1(Number.NEGATIVE_INFINITY) === -1);
assert(1/Math.expm1(-0) === Number.NEGATIVE_INFINITY)
assert(1/Math.expm1(0) === Number.POSITIVE_INFINITY)
assert(Math.expm1(1) <= 1.00000001 * (Math.E - 1));
assert(Math.expm1(1) >= 0.99999999 * (Math.E - 1));
+26
View File
@@ -0,0 +1,26 @@
// Copyright JS Foundation and other contributors, http://js.foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
var p_zero = 0.0;
var n_zero = -p_zero;
assert(isNaN(Math.log10(NaN)));
assert(isNaN(Math.log10(-42)));
assert(isNaN(Math.log10(-3.0)));
assert(Math.log10(n_zero) === Number.NEGATIVE_INFINITY);
assert(Math.log10(p_zero) === Number.NEGATIVE_INFINITY);
assert(Math.log10(1) === p_zero);
assert(Math.log10(Number.POSITIVE_INFINITY) === Number.POSITIVE_INFINITY);
assert(Math.log10(10.0) === 1);
assert(Math.log10(100.0) === 2)
+30
View File
@@ -0,0 +1,30 @@
// Copyright JS Foundation and other contributors, http://js.foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
var p_zero = 0.0;
var n_zero = -p_zero;
function isSameZero (x, y)
{
return x === 0 && (1 / x) === (1 / y);
}
assert(isNaN(Math.log1p(NaN)));
assert(isNaN(Math.log1p(-42)));
assert(isNaN(Math.log1p(-3.0)));
assert(isSameZero(Math.log1p(n_zero), n_zero));
assert(isSameZero(Math.log1p(p_zero), p_zero));
assert(Math.log1p(-1) === Number.NEGATIVE_INFINITY);
assert(Math.log1p(Number.POSITIVE_INFINITY) === Number.POSITIVE_INFINITY);
assert(Math.log1p(Math.E - 1) === 1);
+27
View File
@@ -0,0 +1,27 @@
// Copyright JS Foundation and other contributors, http://js.foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
var p_zero = 0.0;
var n_zero = -p_zero;
assert(isNaN(Math.log2(NaN)));
assert(isNaN(Math.log2(-42)));
assert(isNaN(Math.log2(-3.0)));
assert(Math.log2(n_zero) === Number.NEGATIVE_INFINITY);
assert(Math.log2(p_zero) === Number.NEGATIVE_INFINITY);
assert(Math.log2(1) === p_zero);
assert(Math.log2(Number.POSITIVE_INFINITY) === Number.POSITIVE_INFINITY);
assert(Math.log2(2.0) === 1);
assert(Math.log2(4.0) === 2)
assert(Math.log2(1024.0) === 10)
+84
View File
@@ -205,6 +205,33 @@ check_double ("exp (2.0)", exp (2.0), 7.38905609893065040694E+00);
check_double ("exp (3.0)", exp (3.0), 2.00855369231876679237E+01);
check_double ("exp (0.7)", exp (0.7), 2.01375270747047663278E+00);
check_double ("exp (38.0)", exp (38.0), 3.18559317571137560000E+16);
check_double ("expm1 (0.0)", expm1 (0.0), 0.00000000000000000000E+00);
check_double ("expm1 (-0.0)", expm1 (-0.0), -0.00000000000000000000E+00);
check_double ("expm1 (1.0)", expm1 (1.0), 1.71828182845904531284E+00);
check_double ("expm1 (-1.0)", expm1 (-1.0), -6.32120558828557665976E-01);
check_double ("expm1 (INFINITY)", expm1 (INFINITY), INF);
check_double ("expm1 (-INFINITY)", expm1 (-INFINITY), -1.00000000000000000000E+00);
check_double ("expm1 (NAN)", expm1 (NAN), NAN);
check_double ("expm1 (7.08e+02)", expm1 (7.08e+02), 3.02338314427605515848E+307);
check_double ("expm1 (7.10e+02)", expm1 (7.10e+02), INF);
check_double ("expm1 (-7.40e+02)", expm1 (-7.40e+02), -1.00000000000000000000E+00);
check_double ("expm1 (-7.50e+02)", expm1 (-7.50e+02), -1.00000000000000000000E+00);
check_double ("expm1 (0.34)", expm1 (0.34), 4.04947590563593806667E-01);
check_double ("expm1 (-0.34)", expm1 (-0.34), -2.88229677237390291555E-01);
check_double ("expm1 (0.35)", expm1 (0.35), 4.19067548593257233058E-01);
check_double ("expm1 (-0.35)", expm1 (-0.35), -2.95311910281286560398E-01);
check_double ("expm1 (1.03)", expm1 (1.03), 1.80106583469907910455E+00);
check_double ("expm1 (-1.03)", expm1 (-1.03), -6.42993039430852619809E-01);
check_double ("expm1 (1.04)", expm1 (1.04), 1.82921701435155958926E+00);
check_double ("expm1 (-1.04)", expm1 (-1.04), -6.46545318041219840843E-01);
check_double ("expm1 (3.72e-09)", expm1 (3.72e-09), 3.72000000691919994955E-09);
check_double ("expm1 (-3.72e-09)", expm1 (-3.72e-09), -3.71999999308080000097E-09);
check_double ("expm1 (3.73e-09)", expm1 (3.73e-09), 3.73000000695645013275E-09);
check_double ("expm1 (-3.73e-09)", expm1 (-3.73e-09), -3.72999999304355016230E-09);
check_double ("expm1 (2.0)", expm1 (2.0), 6.38905609893065040694E+00);
check_double ("expm1 (3.0)", expm1 (3.0), 1.90855369231876679237E+01);
check_double ("expm1 (0.7)", expm1 (0.7), 1.01375270747047641073E+00);
check_double ("expm1 (38.0)", expm1 (38.0), 3.18559317571137560000E+16);
check_double ("fabs (0.0)", fabs (0.0), 0.00000000000000000000E+00);
check_double ("fabs (-0.0)", fabs (-0.0), 0.00000000000000000000E+00);
check_double ("fabs (1.0)", fabs (1.0), 1.00000000000000000000E+00);
@@ -322,6 +349,63 @@ check_double ("log (0.18)", log (0.18), -1.71479842809192661868E+00);
check_double ("log (1999.0)", log (1999.0), 7.60040233450039970364E+00);
check_double ("log (2000.0)", log (2000.0), 7.60090245954208221235E+00);
check_double ("log (2001.0)", log (2001.0), 7.60140233458373337783E+00);
check_double ("log1p (0.0)", log1p (0.0), 0.00000000000000000000E+00);
check_double ("log1p (-0.0)", log1p (-0.0), -0.00000000000000000000E+00);
check_double ("log1p (1.0)", log1p (1.0), 6.93147180559945286227E-01);
check_double ("log1p (-1.0)", log1p (-1.0), -INF);
check_double ("log1p (INFINITY)", log1p (INFINITY), INF);
check_double ("log1p (-INFINITY)", log1p (-INFINITY), -NAN);
check_double ("log1p (NAN)", log1p (NAN), NAN);
check_double ("log1p (M_E)", log1p (M_E), 1.31326168751822280889E+00);
check_double ("log1p (1.0 / M_E)", log1p (1.0 / M_E), 3.13261687518222864401E-01);
check_double ("log1p (2)", log1p (2), 1.09861228866810978211E+00);
check_double ("log1p (10)", log1p (10), 2.39789527279837066942E+00);
check_double ("log1p (0.7)", log1p (0.7), 5.30628251062170375185E-01);
check_double ("log1p (2.22e-308)", log1p (2.22e-308), 2.22000000000000013467E-308);
check_double ("log1p (2.23e-308)", log1p (2.23e-308), 2.23000000000000010412E-308);
check_double ("log1p (0.17)", log1p (0.17), 1.57003748809664750441E-01);
check_double ("log1p (0.18)", log1p (0.18), 1.65514438477573383457E-01);
check_double ("log1p (1999.0)", log1p (1999.0), 7.60090245954208221235E+00);
check_double ("log1p (2000.0)", log1p (2000.0), 7.60140233458373337783E+00);
check_double ("log1p (2001.0)", log1p (2001.0), 7.60190195987516581511E+00);
check_double ("log2 (0.0)", log2 (0.0), -INF);
check_double ("log2 (-0.0)", log2 (-0.0), -INF);
check_double ("log2 (1.0)", log2 (1.0), 0.00000000000000000000E+00);
check_double ("log2 (-1.0)", log2 (-1.0), NAN);
check_double ("log2 (INFINITY)", log2 (INFINITY), INF);
check_double ("log2 (-INFINITY)", log2 (-INFINITY), NAN);
check_double ("log2 (NAN)", log2 (NAN), NAN);
check_double ("log2 (M_E)", log2 (M_E), 1.44269504088896338700E+00);
check_double ("log2 (1.0 / M_E)", log2 (1.0 / M_E), -1.44269504088896338700E+00);
check_double ("log2 (2)", log2 (2), 1.00000000000000000000E+00);
check_double ("log2 (10)", log2 (10), 3.32192809488736218171E+00);
check_double ("log2 (0.7)", log2 (0.7), -5.14573172829758340718E-01);
check_double ("log2 (2.22e-308)", log2 (2.22e-308), -1.02200329354873224474E+03);
check_double ("log2 (2.23e-308)", log2 (2.23e-308), -1.02199680951516199912E+03);
check_double ("log2 (0.17)", log2 (0.17), -2.55639334852438526724E+00);
check_double ("log2 (0.18)", log2 (0.18), -2.47393118833241221211E+00);
check_double ("log2 (1999.0)", log2 (1999.0), 1.09650627567446274924E+01);
check_double ("log2 (2000.0)", log2 (2000.0), 1.09657842846620869892E+01);
check_double ("log2 (2001.0)", log2 (2001.0), 1.09665054519057409976E+01);
check_double ("log10 (0.0)", log10 (0.0), -INF);
check_double ("log10 (-0.0)", log10 (-0.0), -INF);
check_double ("log10 (1.0)", log10 (1.0), 0.00000000000000000000E+00);
check_double ("log10 (-1.0)", log10 (-1.0), NAN);
check_double ("log10 (INFINITY)", log10 (INFINITY), INF);
check_double ("log10 (-INFINITY)", log10 (-INFINITY), NAN);
check_double ("log10 (NAN)", log10 (NAN), NAN);
check_double ("log10 (M_E)", log10 (M_E), 4.34294481903251816668E-01);
check_double ("log10 (1.0 / M_E)", log10 (1.0 / M_E), -4.34294481903251816668E-01);
check_double ("log10 (2)", log10 (2), 3.01029995663981198017E-01);
check_double ("log10 (10)", log10 (10), 1.00000000000000000000E+00);
check_double ("log10 (0.7)", log10 (0.7), -1.54901959985743187254E-01);
check_double ("log10 (2.22e-308)", log10 (2.22e-308), -3.07653647025549389582E+02);
check_double ("log10 (2.23e-308)", log10 (2.23e-308), -3.07651695136951843779E+02);
check_double ("log10 (0.17)", log10 (0.17), -7.69551078621726003526E-01);
check_double ("log10 (0.18)", log10 (0.18), -7.44727494896693986703E-01);
check_double ("log10 (1999.0)", log10 (1999.0), 3.30081279411811712166E+00);
check_double ("log10 (2000.0)", log10 (2000.0), 3.30102999566398125353E+00);
check_double ("log10 (2001.0)", log10 (2001.0), 3.30124708863621130206E+00);
check_double ("pow (0.0, 0.0)", pow (0.0, 0.0), 1.00000000000000000000E+00);
check_double ("pow (0.0, -0.0)", pow (0.0, -0.0), 1.00000000000000000000E+00);
check_double ("pow (-0.0, 0.0)", pow (-0.0, 0.0), 1.00000000000000000000E+00);