在我的node.js程序中,我运行了这段代码
console.log(Math.tanh(-858.625086043538));
并返回NaN
。然而,为所有x
定义了tanh(双曲正切)http://mathworld.wolfram.com/HyperbolicTangent.html。它应该返回-1
,但它会给NaN
。有谁知道什么是错的?
由于
答案 0 :(得分:2)
在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;
};