Skip to content

Commit 7253f6c

Browse files
committed
improve accuracy of Math.asinh polyfill with big values
1 parent 491721f commit 7253f6c

File tree

4 files changed

+13
-2
lines changed

4 files changed

+13
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
- Throw a `RangeError` on `NaN` `start` / `end` / `step`
66
- Allow `null` as `optionOrStep`
77
- Fixed some other edge cases
8-
- `Math.atanh` has become slightly more correct with small values
8+
- Improved accuracy of `Math.{ asinh, atanh }` polyfills with big and small values
99
- Wrap `Symbol.for` in `Symbol.prototype.description` polyfill for correct handling of empty string descriptions
1010
- Fixed one more case (`Iterator.prototype.take`) of a V8 ~ Chromium < 126 [bug](https://issues.chromium.org/issues/336839115)
1111
- Forced replacement of `Iterator.{ concat, zip, zipKeyed }` in the pure version for ensuring proper wrapped `Iterator` instances as the result

packages/core-js/modules/es.math.asinh.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@ var $ = require('../internals/export');
55
var $asinh = Math.asinh;
66
var log = Math.log;
77
var sqrt = Math.sqrt;
8+
var LN2 = Math.LN2;
9+
// sqrt(2 ** 53) - prevent n * n overflow
10+
var SQRT_2_POW_53 = 94906265.62425156;
811

912
function asinh(x) {
1013
var n = +x;
11-
return !isFinite(n) || n === 0 ? n : n < 0 ? -asinh(-n) : log(n + sqrt(n * n + 1));
14+
return !isFinite(n) || n === 0 ? n : n < 0 ? -asinh(-n) : n > SQRT_2_POW_53 ? log(n) + LN2 : log(n + sqrt(n * n + 1));
1215
}
1316

1417
var FORCED = !($asinh && 1 / $asinh(0) > 0);

tests/unit-global/es.math.asinh.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ QUnit.test('Math.asinh', assert => {
1717
assert.closeTo(asinh(1e150), 346.0809111296668, 1e-11);
1818
assert.closeTo(asinh(1e7), 16.811242831518268, 1e-11);
1919
assert.closeTo(asinh(-1e7), -16.811242831518268, 1e-11);
20+
assert.closeTo(asinh(1e200), 461.2101657793691, 1e-6, 'large value 1e200');
21+
assert.closeTo(asinh(1e300), 691.4686750787736, 1e-6, 'large value 1e300');
22+
assert.closeTo(asinh(Number.MAX_VALUE), 710.4758600739439, 1e-6, 'Number.MAX_VALUE');
23+
assert.closeTo(asinh(-1e200), -461.2101657793691, 1e-6, 'large negative value');
2024

2125
const checker = createConversionChecker(1234);
2226
assert.closeTo(asinh(checker), 7.811163549201245, 1e-11);

tests/unit-pure/es.math.asinh.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ QUnit.test('Math.asinh', assert => {
1414
assert.closeTo(asinh(1e150), 346.0809111296668, 1e-11);
1515
assert.closeTo(asinh(1e7), 16.811242831518268, 1e-11);
1616
assert.closeTo(asinh(-1e7), -16.811242831518268, 1e-11);
17+
assert.closeTo(asinh(1e200), 461.2101657793691, 1e-6, 'large value 1e200');
18+
assert.closeTo(asinh(1e300), 691.4686750787736, 1e-6, 'large value 1e300');
19+
assert.closeTo(asinh(Number.MAX_VALUE), 710.4758600739439, 1e-6, 'Number.MAX_VALUE');
20+
assert.closeTo(asinh(-1e200), -461.2101657793691, 1e-6, 'large negative value');
1721

1822
const checker = createConversionChecker(1234);
1923
assert.closeTo(asinh(checker), 7.811163549201245, 1e-11);

0 commit comments

Comments
 (0)