在节点命令行界面中运行此命令时:
> Math.tan(Math.PI/2) 16331778728383844
但是在Chrome中:
> Math.tan(Math.PI/2) Infinity
都不都使用同一个V8引擎吗?
Node的结果甚至不等于JavaScript中的最大“整数”值。
如果查看该Math对象的v8实现,则会看到:
Math
function MathTan(x) { return MathSin(x) / MathCos(x); }
实际上,Math.cos(Math.PI/2)也会在Node中返回一个异常值(实际上,是异常Math.tan结果的倒数):
Math.cos(Math.PI/2)
Math.tan
> Math.cos(Math.PI/2) 6.123031769111886e-17 // in Chrome, this is 0
因此,您的问题 简化 为: 为什么Math.cos(Math.PI/2)Node <= 0.10.24中的非零值?
这很难回答。正弦和余弦的实现由名为的数学运算函数提供,该函数TrigonometricInterpolation依赖于C ++代码生成的1800个样本值的反向查找表,该代码本身是在首次安装v8时生成的Python脚本。
TrigonometricInterpolation
但是,还值得注意的是,当前的trig查找表代码最近替换了较旧的查找表,因此,当前版本的Node可能未使用最新的trig查找表(因为新代码于11月22日到达v8中) ,2013年,但在2013年12月0.10.24版之前,从v8到Node的唯一拉动是在2013年11月11日(即更改前的11天)。Chrome可能正在使用最新代码,而当前的稳定节点正在使用其他三角代码。