Javascript Tanh返回NaN以获取大量输入?

Javascript Tanh返回NaN以获取大量输入?,javascript,hyperbolic-function,Javascript,Hyperbolic Function,在node.js程序中,我运行了以下代码 console.log(Math.tanh(-858.625086043538)); 它返回了NaN。然而,tanh(双曲正切)是为所有x定义的。它应该只返回-1,但它的赋值是NaN。有人知道怎么了吗 Thank看起来像是一个糟糕的实现,它采用了e^(+/-x),对于更大的输入,它会返回(-Infinity/Infinity),而且是NaN 好消息是这是固定的。这就是为什么它可以在当前版本的Chrome DevTools中工作 如果您不能等到Node.

在node.js程序中,我运行了以下代码

console.log(Math.tanh(-858.625086043538));
它返回了
NaN
。然而,tanh(双曲正切)是为所有
x
定义的。它应该只返回
-1
,但它的赋值是
NaN
。有人知道怎么了吗


Thank

看起来像是一个糟糕的实现,它采用了e^(+/-x),对于更大的输入,它会返回(
-Infinity/Infinity
),而且是
NaN

好消息是这是固定的。这就是为什么它可以在当前版本的Chrome DevTools中工作

如果您不能等到Node.js引入最新的V8,那么您可以将其移植到您自己的代码中(基于),这似乎可以正常工作。您只需承担将来可能发生的对真实v8math.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;
};
Math.tanh=函数(x){
x=x*1;//转换为数字。
//x是无穷大或NaN
如果(!Math.abs(x)==无穷大){
如果(x>0)返回1;
如果(x<0)返回-1;
返回x;
}
var ax=数学绝对值(x);
var z;
//| x |<22
如果(ax<22){
var twoM55=2.77555756156289135105e-17;//2^-55,下半部分为空
如果(ax=1){
//| x |>=1
var t=数学表达式(2*ax);
z=1-2/(t+2);
}否则{
var t=数学表达式(-2*ax);
z=-t/(t+2);
}
}否则{
//| x |>22,返回+/-1
z=1;
}
返回值(x>=0)?z:-z;
};