为什么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)
而chrome的Number.MAX_INTEGER
小于 Math.tan(Math.PI/2)
。
所以nodejs看到一个数字而chrome看到Infinity 。
与头版本
node -v v0.11.14-pre node > Math.tan(Math.PI/2) Infinity