gpt4 book ai didi

javascript - Tanh 为大输入返回 NaN?

转载 作者:行者123 更新时间:2023-11-30 16:20:26 28 4
gpt4 key购买 nike

在我的 node.js 程序中,我运行了这段代码

console.log(Math.tanh(-858.625086043538));

它返回了 NaN。然而,tanh(双曲正切)http://mathworld.wolfram.com/HyperbolicTangent.html为所有 x 定义。它应该只返回 -1,但它给出了 NaN。有谁知道怎么了?

谢谢

最佳答案

Node.js (v5.4.1) version of V8 (4.6.85.31) 中看起来是一个糟糕的实现这是采用 e^(+/-x) ,对于更大的输入,会导致返回 (-Infinity/Infinity) ,进一步是 NaN .

好消息是这已在 V8 version v4.8.87 with a commit that moved to a js fdlibm port 中修复.这就是它适用于您当前版本的 Chrome DevTools 的原因。

如果您不能等到 Node.js 引入最新的 V8,您可以移植 current V8 implementation进入您自己的代码(基于 this port of fdlibm ),这似乎工作正常。您只是冒着将来可能对 真正的 V8 Math.tanh 进行任何修复或更改的风险。这是 V8/fdlibm 端口:

Math.tanh = function (x) {
x = x * 1; // Convert to number.
// x is Infinity or NaN
if (!Math.abs(x) === Infinity) {
if (x > 0) return 1;
if (x < 0) return -1;
return x;
}
var ax = Math.abs(x);
var z;
// |x| < 22
if (ax < 22) {
var twoM55 = 2.77555756156289135105e-17; // 2^-55, empty lower half
if (ax < twoM55) {
// |x| < 2^-55, tanh(small) = small.
return x;
}
if (ax >= 1) {
// |x| >= 1
var t = Math.exp(2 * ax);
z = 1 - 2 / (t + 2);
} else {
var t = Math.exp(-2 * ax);
z = -t / (t + 2);
}
} else {
// |x| > 22, return +/- 1
z = 1;
}
return (x >= 0) ? z : -z;
};

关于javascript - Tanh 为大输入返回 NaN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34835641/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com