Implement missing hyperbolic Math functions from ES6 (#3670)

Math.cosh, Math.sinh, Math.tanh

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-21 12:34:38 +02:00
committed by GitHub
parent d1bf9635c7
commit bcd5ff3f40
11 changed files with 718 additions and 12 deletions
+22
View File
@@ -0,0 +1,22 @@
// 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.cosh(NaN)));
assert(Math.cosh(p_zero) === 1);
assert(Math.cosh(n_zero) === 1);
assert(Math.cosh(Number.POSITIVE_INFINITY) === Number.POSITIVE_INFINITY);
assert(Math.cosh(Number.NEGATIVE_INFINITY) === Number.POSITIVE_INFINITY);
+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;
function isSameZero (x, y)
{
return x === 0 && (1 / x) === (1 / y);
}
assert(isNaN(Math.sinh(NaN)));
assert(isSameZero(Math.sinh(p_zero), p_zero));
assert(isSameZero(Math.sinh(n_zero), n_zero));
assert(Math.sinh(Number.POSITIVE_INFINITY) === Number.POSITIVE_INFINITY);
assert(Math.sinh(Number.NEGATIVE_INFINITY) === Number.NEGATIVE_INFINITY);
+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;
function isSameZero (x, y)
{
return x === 0 && (1 / x) === (1 / y);
}
assert(isNaN(Math.tanh(NaN)));
assert(isSameZero(Math.tanh(p_zero), p_zero));
assert(isSameZero(Math.tanh(n_zero), n_zero));
assert(Math.tanh(Number.POSITIVE_INFINITY) === 1);
assert(Math.tanh(Number.NEGATIVE_INFINITY) === -1);
+141
View File
@@ -768,3 +768,144 @@ check_double ("tan (6.0)", tan (6.0), -2.91006191384749146600E-01);
check_double ("tan (-6.0)", tan (-6.0), 2.91006191384749146600E-01);
check_double ("tan (7.0)", tan (7.0), 8.71447982724318781500E-01);
check_double ("tan (-7.0)", tan (-7.0), -8.71447982724318781500E-01);
check_double ("cosh (0.0)", cosh (0.0), 1.00000000000000000000E+00);
check_double ("cosh (-0.0)", cosh (-0.0), 1.00000000000000000000E+00);
check_double ("cosh (1.0)", cosh (1.0), 1.54308063481524371241E+00);
check_double ("cosh (-1.0)", cosh (-1.0), 1.54308063481524371241E+00);
check_double ("cosh (INFINITY)", cosh (INFINITY), INF);
check_double ("cosh (-INFINITY)", cosh (-INFINITY), INF);
check_double ("cosh (NAN)", cosh (NAN), NAN);
check_double ("cosh (M_PI)", cosh (M_PI), 1.15919532755215186626E+01);
check_double ("cosh (-M_PI)", cosh (-M_PI), 1.15919532755215186626E+01);
check_double ("cosh (2.0 * M_PI)", cosh (2.0 * M_PI), 2.67746761483748173305E+02);
check_double ("cosh (-2.0 * M_PI)", cosh (-2.0 * M_PI), 2.67746761483748173305E+02);
check_double ("cosh (M_PI / 2.0)", cosh (M_PI / 2.0), 2.50917847865805665464E+00);
check_double ("cosh (-M_PI / 2.0)", cosh (-M_PI / 2.0), 2.50917847865805665464E+00);
check_double ("cosh (M_PI / 3.0)", cosh (M_PI / 3.0), 1.60028685770238610075E+00);
check_double ("cosh (-M_PI / 3.0)", cosh (-M_PI / 3.0), 1.60028685770238610075E+00);
check_double ("cosh (M_PI / 4.0)", cosh (M_PI / 4.0), 1.32460908925200571140E+00);
check_double ("cosh (-M_PI / 4.0)", cosh (-M_PI / 4.0), 1.32460908925200571140E+00);
check_double ("cosh (M_PI / 6.0)", cosh (M_PI / 6.0), 1.14023832107642886236E+00);
check_double ("cosh (-M_PI / 6.0)", cosh (-M_PI / 6.0), 1.14023832107642886236E+00);
check_double ("cosh (M_PI * 2.0 / 3.0)", cosh (M_PI * 2.0 / 3.0), 4.12183605386995388642E+00);
check_double ("cosh (-M_PI * 2.0 / 3.0)", cosh (-M_PI * 2.0 / 3.0), 4.12183605386995388642E+00);
check_double ("cosh (M_PI * 5.0 / 6.0)", cosh (M_PI * 5.0 / 6.0), 6.89057236497588299073E+00);
check_double ("cosh (-M_PI * 5.0 / 6.0)", cosh (-M_PI * 5.0 / 6.0), 6.89057236497588299073E+00);
check_double ("cosh (6.9e-18)", cosh (6.9e-18), 1.00000000000000000000E+00);
check_double ("cosh (-6.9e-18)", cosh (-6.9e-18), 1.00000000000000000000E+00);
check_double ("cosh (7.0e-18)", cosh (7.0e-18), 1.00000000000000000000E+00);
check_double ("cosh (-7.0e-18)", cosh (-7.0e-18), 1.00000000000000000000E+00);
check_double ("cosh (7.4e-9)", cosh (7.4e-9), 1.00000000000000000000E+00);
check_double ("cosh (-7.4e-9)", cosh (-7.4e-9), 1.00000000000000000000E+00);
check_double ("cosh (7.5e-9)", cosh (7.5e-9), 1.00000000000000000000E+00);
check_double ("cosh (-7.5e-9)", cosh (-7.5e-9), 1.00000000000000000000E+00);
check_double ("cosh (0.2)", cosh (0.2), 1.02006675561907589334E+00);
check_double ("cosh (-0.2)", cosh (-0.2), 1.02006675561907589334E+00);
check_double ("cosh (0.4)", cosh (0.4), 1.08107237183845472650E+00);
check_double ("cosh (-0.4)", cosh (-0.4), 1.08107237183845472650E+00);
check_double ("cosh (0.7)", cosh (0.7), 1.25516900563094302434E+00);
check_double ("cosh (-0.7)", cosh (-0.7), 1.25516900563094302434E+00);
check_double ("cosh (0.8)", cosh (0.8), 1.33743494630484471841E+00);
check_double ("cosh (-0.8)", cosh (-0.8), 1.33743494630484471841E+00);
check_double ("cosh (3.0)", cosh (3.0), 1.00676619957777653269E+01);
check_double ("cosh (-3.0)", cosh (-3.0), 1.00676619957777653269E+01);
check_double ("cosh (4.0)", cosh (4.0), 2.73082328360164865444E+01);
check_double ("cosh (-4.0)", cosh (-4.0), 2.73082328360164865444E+01);
check_double ("cosh (6.0)", cosh (6.0), 2.01715636122455890700E+02);
check_double ("cosh (-6.0)", cosh (-6.0), 2.01715636122455890700E+02);
check_double ("cosh (7.0)", cosh (7.0), 5.48317035155212124664E+02);
check_double ("cosh (-7.0)", cosh (-7.0), 5.48317035155212124664E+02);
check_double ("sinh (0.0)", sinh (0.0), 0.00000000000000000000E+00);
check_double ("sinh (-0.0)", sinh (-0.0), -0.00000000000000000000E+00);
check_double ("sinh (1.0)", sinh (1.0), 1.17520119364380137839E+00);
check_double ("sinh (-1.0)", sinh (-1.0), -1.17520119364380137839E+00);
check_double ("sinh (INFINITY)", sinh (INFINITY), INF);
check_double ("sinh (-INFINITY)", sinh (-INFINITY), -INF);
check_double ("sinh (NAN)", sinh (NAN), NAN);
check_double ("sinh (M_PI)", sinh (M_PI), 1.15487393572577463630E+01);
check_double ("sinh (-M_PI)", sinh (-M_PI), -1.15487393572577463630E+01);
check_double ("sinh (2.0 * M_PI)", sinh (2.0 * M_PI), 2.67744894041016436859E+02);
check_double ("sinh (-2.0 * M_PI)", sinh (-2.0 * M_PI), -2.67744894041016436859E+02);
check_double ("sinh (M_PI / 2.0)", sinh (M_PI / 2.0), 2.30129890230729472478E+00);
check_double ("sinh (-M_PI / 2.0)", sinh (-M_PI / 2.0), -2.30129890230729472478E+00);
check_double ("sinh (M_PI / 3.0)", sinh (M_PI / 3.0), 1.24936705052397512006E+00);
check_double ("sinh (-M_PI / 3.0)", sinh (-M_PI / 3.0), -1.24936705052397512006E+00);
check_double ("sinh (M_PI / 4.0)", sinh (M_PI / 4.0), 8.68670961486009529651E-01);
check_double ("sinh (-M_PI / 4.0)", sinh (-M_PI / 4.0), -8.68670961486009529651E-01);
check_double ("sinh (M_PI / 6.0)", sinh (M_PI / 6.0), 5.47853473888039732564E-01);
check_double ("sinh (-M_PI / 6.0)", sinh (-M_PI / 6.0), -5.47853473888039732564E-01);
check_double ("sinh (M_PI * 2.0 / 3.0)", sinh (M_PI * 2.0 / 3.0), 3.99869134279982052504E+00);
check_double ("sinh (-M_PI * 2.0 / 3.0)", sinh (-M_PI * 2.0 / 3.0), -3.99869134279982052504E+00);
check_double ("sinh (M_PI * 5.0 / 6.0)", sinh (M_PI * 5.0 / 6.0), 6.81762330412654371514E+00);
check_double ("sinh (-M_PI * 5.0 / 6.0)", sinh (-M_PI * 5.0 / 6.0), -6.81762330412654371514E+00);
check_double ("sinh (6.9e-18)", sinh (6.9e-18), 6.90000000000000026253E-18);
check_double ("sinh (-6.9e-18)", sinh (-6.9e-18), -6.90000000000000026253E-18);
check_double ("sinh (7.0e-18)", sinh (7.0e-18), 6.99999999999999973042E-18);
check_double ("sinh (-7.0e-18)", sinh (-7.0e-18), -6.99999999999999973042E-18);
check_double ("sinh (7.4e-9)", sinh (7.4e-9), 7.40000000000000008865E-09);
check_double ("sinh (-7.4e-9)", sinh (-7.4e-9), -7.40000000000000008865E-09);
check_double ("sinh (7.5e-9)", sinh (7.5e-9), 7.49999999999999932974E-09);
check_double ("sinh (-7.5e-9)", sinh (-7.5e-9), -7.49999999999999932974E-09);
check_double ("sinh (0.2)", sinh (0.2), 2.01336002541093989082E-01);
check_double ("sinh (-0.2)", sinh (-0.2), -2.01336002541093989082E-01);
check_double ("sinh (0.4)", sinh (0.4), 4.10752325802815509981E-01);
check_double ("sinh (-0.4)", sinh (-0.4), -4.10752325802815509981E-01);
check_double ("sinh (0.7)", sinh (0.7), 7.58583701839533497413E-01);
check_double ("sinh (-0.7)", sinh (-0.7), -7.58583701839533497413E-01);
check_double ("sinh (0.8)", sinh (0.8), 8.88105982187623044233E-01);
check_double ("sinh (-0.8)", sinh (-0.8), -8.88105982187623044233E-01);
check_double ("sinh (3.0)", sinh (3.0), 1.00178749274099025968E+01);
check_double ("sinh (-3.0)", sinh (-3.0), -1.00178749274099025968E+01);
check_double ("sinh (4.0)", sinh (4.0), 2.72899171971277532123E+01);
check_double ("sinh (-4.0)", sinh (-4.0), -2.72899171971277532123E+01);
check_double ("sinh (6.0)", sinh (6.0), 2.01713157370279219549E+02);
check_double ("sinh (-6.0)", sinh (-6.0), -2.01713157370279219549E+02);
check_double ("sinh (7.0)", sinh (7.0), 5.48316123273246489589E+02);
check_double ("sinh (-7.0)", sinh (-7.0), -5.48316123273246489589E+02);
check_double ("tanh (0.0)", tanh (0.0), 0.00000000000000000000E+00);
check_double ("tanh (-0.0)", tanh (-0.0), -0.00000000000000000000E+00);
check_double ("tanh (1.0)", tanh (1.0), 7.61594155955764851029E-01);
check_double ("tanh (-1.0)", tanh (-1.0), -7.61594155955764851029E-01);
check_double ("tanh (INFINITY)", tanh (INFINITY), 1.00000000000000000000E+00);
check_double ("tanh (-INFINITY)", tanh (-INFINITY), -1.00000000000000000000E+00);
check_double ("tanh (NAN)", tanh (NAN), NAN);
check_double ("tanh (M_PI)", tanh (M_PI), 9.96272076220749980280E-01);
check_double ("tanh (-M_PI)", tanh (-M_PI), -9.96272076220749980280E-01);
check_double ("tanh (2.0 * M_PI)", tanh (2.0 * M_PI), 9.99993025339610652757E-01);
check_double ("tanh (-2.0 * M_PI)", tanh (-2.0 * M_PI), -9.99993025339610652757E-01);
check_double ("tanh (M_PI / 2.0)", tanh (M_PI / 2.0), 9.17152335667274387632E-01);
check_double ("tanh (-M_PI / 2.0)", tanh (-M_PI / 2.0), -9.17152335667274387632E-01);
check_double ("tanh (M_PI / 3.0)", tanh (M_PI / 3.0), 7.80714435359267655556E-01);
check_double ("tanh (-M_PI / 3.0)", tanh (-M_PI / 3.0), -7.80714435359267655556E-01);
check_double ("tanh (M_PI / 4.0)", tanh (M_PI / 4.0), 6.55794202632672407205E-01);
check_double ("tanh (-M_PI / 4.0)", tanh (-M_PI / 4.0), -6.55794202632672407205E-01);
check_double ("tanh (M_PI / 6.0)", tanh (M_PI / 6.0), 4.80472778156451563181E-01);
check_double ("tanh (-M_PI / 6.0)", tanh (-M_PI / 6.0), -4.80472778156451563181E-01);
check_double ("tanh (M_PI * 2.0 / 3.0)", tanh (M_PI * 2.0 / 3.0), 9.70123821165930766419E-01);
check_double ("tanh (-M_PI * 2.0 / 3.0)", tanh (-M_PI * 2.0 / 3.0), -9.70123821165930766419E-01);
check_double ("tanh (M_PI * 5.0 / 6.0)", tanh (M_PI * 5.0 / 6.0), 9.89413207352682011475E-01);
check_double ("tanh (-M_PI * 5.0 / 6.0)", tanh (-M_PI * 5.0 / 6.0), -9.89413207352682011475E-01);
check_double ("tanh (6.9e-18)", tanh (6.9e-18), 6.90000000000000026253E-18);
check_double ("tanh (-6.9e-18)", tanh (-6.9e-18), -6.90000000000000026253E-18);
check_double ("tanh (7.0e-18)", tanh (7.0e-18), 6.99999999999999973042E-18);
check_double ("tanh (-7.0e-18)", tanh (-7.0e-18), -6.99999999999999973042E-18);
check_double ("tanh (7.4e-9)", tanh (7.4e-9), 7.40000000000000008865E-09);
check_double ("tanh (-7.4e-9)", tanh (-7.4e-9), -7.40000000000000008865E-09);
check_double ("tanh (7.5e-9)", tanh (7.5e-9), 7.49999999999999932974E-09);
check_double ("tanh (-7.5e-9)", tanh (-7.5e-9), -7.49999999999999932974E-09);
check_double ("tanh (0.2)", tanh (0.2), 1.97375320224904005073E-01);
check_double ("tanh (-0.2)", tanh (-0.2), -1.97375320224904005073E-01);
check_double ("tanh (0.4)", tanh (0.4), 3.79948962255224897966E-01);
check_double ("tanh (-0.4)", tanh (-0.4), -3.79948962255224897966E-01);
check_double ("tanh (0.7)", tanh (0.7), 6.04367777117163496037E-01);
check_double ("tanh (-0.7)", tanh (-0.7), -6.04367777117163496037E-01);
check_double ("tanh (0.8)", tanh (0.8), 6.64036770267849019156E-01);
check_double ("tanh (-0.8)", tanh (-0.8), -6.64036770267849019156E-01);
check_double ("tanh (3.0)", tanh (3.0), 9.95054753686730464324E-01);
check_double ("tanh (-3.0)", tanh (-3.0), -9.95054753686730464324E-01);
check_double ("tanh (4.0)", tanh (4.0), 9.99329299739067034025E-01);
check_double ("tanh (-4.0)", tanh (-4.0), -9.99329299739067034025E-01);
check_double ("tanh (6.0)", tanh (6.0), 9.99987711650795585427E-01);
check_double ("tanh (-6.0)", tanh (-6.0), -9.99987711650795585427E-01);
check_double ("tanh (7.0)", tanh (7.0), 9.99998336943944687860E-01);
check_double ("tanh (-7.0)", tanh (-7.0), -9.99998336943944687860E-01);