一尘不染

为什么节点不将Math.tan(Math.PI / 2)评估为Infinity而Chrome V8可以呢?

node.js

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

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

但是在Chrome中:

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

都不都使用同一个V8引擎吗?

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


阅读 292

收藏
2020-07-07

共1个答案

一尘不染

如果查看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中的非零值?

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

但是,还值得注意的是,当前的trig查找表代码最近替换了较旧的查找表,因此,当前版本的Node可能未使用最新的trig查找表(因为新代码于11月22日到达v8中)
,2013年,但在2013年12月0.10.24版之前,从v8到Node的唯一拉动是在2013年11月11日(即更改前的11天)。Chrome可能正在使用最新代码,而当前的稳定节点正在使用其他三角代码。

2020-07-07