为什么node不会评估Math.tan(Math.PI / 2)到Infinity,但是Chrome V8呢?

在节点命令行界面中运行时:

> Math.tan(Math.PI/2) 16331778728383844 

但在Chrome中:

 > Math.tan(Math.PI/2) Infinity 

不是都使用相同的V8引擎?

节点的结果甚至不等于JavaScript中的最大“整数”值 。

如果您查看Math对象的v8实现 ,则会看到:

 function MathTan(x) { return MathSin(x) / MathCos(x); } 

事实上, Math.cos(Math.PI/2)也会在Node中返回一个不寻常的值(事实上,你的不寻常的Math.tan结果的倒数):

 > Math.cos(Math.PI/2) 6.123031769111886e-17 // in Chrome, this is 0 

所以,你的问题可以Math.cos(Math.PI/2)为: Node <= 0.10.24为什么Math.cos(Math.PI/2)是非零的?

这很难回答。 正弦和余弦的实现由一个名为TrigonometricInterpolation的math重载函数提供,该函数依赖于由C ++代码生成的1800个样本值的反向查找表,该代码在第一次安装v8时自身生成一个Python脚本 。

然而,值得注意的是,当前的trig查找表代码最近取代了一个较旧的查找表 ,所以当前的Node版本可能不会使用最新的trig查找表(因为新代码在11月22日到达v8 ,2013年,但2013年12月0.10.24发布之前, 从v8版本进入Node的唯一function是2013年11月11日,即更改前的11天)。 Chrome可能正在使用最新的代码,而当前稳定的Node正在使用不同的三angular代码。

如果你input:

 Math.PI/2 

你准确得到π/ 2吗? 不 ;)

因此, Math.tan(Math.PI/2)无法精确地计算为Infinity因为它没有Math.PI/2的精度。

但是在某些情况下(比如Chrome),精度的损失太小,无论如何都会造成Infinity

为了说明这一点,看看这个控制台的输出:

 Math.PI/2 > 1.5707963267948966 Math.tan(1.5707963267948964) > 5039790063769915 Math.tan(1.5707963267948965) > Infinity Math.tan(1.5707963267948966) > Infinity Math.tan(1.5707963267948967) > -5039790063769915 

请注意,实际上有两个值导致Infinity ? 这是不准确的。

事情是,服务器有不同的浏览器设置。 无穷大是variables“Number.POSITIVE_INFINITY”,但如果您签出另一个variables,“Number.MAX_INTEGER”我chrome给:

 console.log( Number.MAX_INTEGER ) // prints 9007199254740991 

和9007199254740991小于16331778728383844,所以可能chrome决定比Number.MAX_INTEGER更大的每个数字是Infinity。

在节点js console.log(Number.MAX_INTEGER)上//打印1.7976931348623157e + 308

Chrome和node js对Numbers有不同的上下限。

总结一下,在nodejs中 Number.MAX_INTEGER Math.tan(Math.PI/2)chromeNumber.MAX_INTEGER 小于 Math.tan(Math.PI/2)

所以nodejs看到一个数字chrome看到Infinity

与头版本

 node -v v0.11.14-pre node > Math.tan(Math.PI/2) Infinity 

https://github.com/joyent/node/issues/7852

Interesting Posts