JavaScript中NaN的唯一二进制表示的含义

JavaScript中NaN的唯一二进制表示的含义,javascript,floating-point,nan,Javascript,Floating Point,Nan,我认为JavaScript只支持一种NaN二进制表示的原因是它允许解释器通过将特定位模式检查为64位整数来加速涉及NaN的操作,而不是依赖FPU来处理它们,这是正确的吗?Stephen Canon的评论促使我运行一些计时测试,我想我应该先做。我把结果作为一个答案发布,以防其他人对它们感兴趣 使用我的Intel Core2四CPU(2.33GHz)PC,我比较了 for(i=0;i<100000000;++i) x += 1.0; 因此,JavaScript似乎正在利用这样一个事实,即它已

我认为JavaScript只支持一种NaN二进制表示的原因是它允许解释器通过将特定位模式检查为64位整数来加速涉及NaN的操作,而不是依赖FPU来处理它们,这是正确的吗?

Stephen Canon的评论促使我运行一些计时测试,我想我应该先做。我把结果作为一个答案发布,以防其他人对它们感兴趣

使用我的Intel Core2四CPU(2.33GHz)PC,我比较了

for(i=0;i<100000000;++i) x += 1.0;
因此,JavaScript似乎正在利用这样一个事实,即它已经必须动态地分派算术运算符来将
NaN
视为特例。

我猜它是一种没有数据的隐藏类型,因此对于
NaN

只有一个二进制表示,为什么你认为添加特殊情况逻辑和分支比让硬件完成它设计的任务更快?@StephenCanon:我的理解(很可能是不正确的)南部的FPU运行速度比非南部的慢。由于解释器必须在类型上进行分支,我想知道选择单一表示是否是为了避免此类操作。一些非常古老的FPU确实处理NaN和无限慢,但这主要是一个历史产物,你今天不太可能遇到,除非你是为一个相当小的处理器编程,或者是非常旧的设备。@StephenCanon:作为一个有点灰胡子的人,我必须承认,我的期望源于几年前,我甚至没有想到FPU的权衡可能已经改变。由于您的评论,我进行了一些计时测试,我认为这些测试已经肯定地回答了我的问题(详细信息作为答案发布,以防其他人关心)。
C++ x==0.0:   124ms
C++ x==NaN: 11888ms

JS  x==0.0:   268ms
JS  x==NaN:   432ms