2012-04-26 29 views

回答

1

虽然ECMAScript语言规范5.1版指出,数字对应IEEE 754个浮动,这意味着计算的原始值应该是一致的

http://www.ecma-international.org/publications/files/ecma-st/ECMA-262.pdf

4.3.19号值

原始值对应于双精度64位二进制格式IEEE 754值

备注 数字值是数字类型的成员,并且是数字的直接表示形式。

由于BlueRaja指出,存在部分15.8.2一种告诫的:

功能ACOS的行为,ASIN,ATAN,ATAN2,COS,EXP,日志, 战俘,罪恶,开方,棕褐色不正是在这里指定...

意义,这些都是至少某些情况下,操作对数字结果是实现相关的,因此可能是不一致的。

+0

我没有任何特定的代码,只是想知道... – 2012-04-26 13:55:55

+2

不正确。看到我的答案。 – 2012-04-26 21:50:48

+0

这个答案不正确。即使x和y相同,同一台机器也可以为像x + y这样的操作返回不同的结果。 BlueRaja的答案是正确的。 – lacker 2012-05-04 19:00:05

3

如果我们假设每个浏览器供应商都遵循标准+ ECMA规范并且在实施时没有人为错误,那么不会有任何区别。

+0

是啊,如果他们遵守标准,他们都表现在标准的方式。无论如何,不​​符合IEEE/ECMA的浏览器可能都不值得使用。 – Romain 2012-04-26 13:50:28

+0

啊,现在你已经添加了“ECMA”,我可以删除我的答案,并upvote你的。 =)读者的更多信息:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf指定了所有ECMAscript数字必须如何表现,通常根据各种IEEE规范。 – ninjagecko 2012-04-26 13:52:29

+0

错误。看到我的答案。 – 2012-04-26 21:50:56

11

其他回答都是错误的。按照ECMAScript 5.1 specs(第15.8.2)

注意的功能ACOS,ASIN,ATAN,ATAN2,COS,EXP, 日志,战俘,罪恶,开方,棕褐色不正是在此规定的行为 除外,要求对某些代表值为 的感兴趣边界案例的参数值进行特定结果。

...

虽然算法的选择是 留给实现,建议(但不是以 本标准规定),其实现使用包含在fdlibm的IEEE 754算法的近似算法 ,来自Sun Microsystems


然而,自由分派 数学库,即使实现分别为指定,全部为的确切结果仍然依赖于浏览器/体系结构。 这包括简单的操作,如乘法和除法!

原因是IEEE-754允许系统在higher-precision than the result上执行64位浮点计算,从而导致与使用与结果相同的精度的系统导致不同的舍入结果。这正是x86 (Intel) architecture does,这就是为什么在C(和JavaScript)我们有时可以有cos(x) != cos(y) even though x == y,即使在同一台机器上!

这是一个big issue for networked peer-to-peer games,因为这意味着,如果更高的精度计算不能被禁用(如对于C#的情况下),这些游戏几乎不能使用浮点计算在所有。但是,这通常不是Javascript游戏的问题,因为它们通常是客户端服务器。

+0

伟大的文章 - 但:通常(因为不精确)使用==或!=与浮游物不是一个好主意。然而,这并不意味着你不能使用浮点数,它只是意味着,不要使用==或!=,而是使用比较<= > =针对任何精度定制的范围。 – delicateLatticeworkFever 2012-04-26 21:58:47

+0

@goldilocks是正确的,事实上(Math.tan(1)== Math.sin(1)/Math.cos(1))产生false ... – 2012-04-27 11:58:23

+1

@João:是的,但是这与您的问题是正交的。每个人都知道,由于浮点不准确,我们可能有'tan(1)!= sin(1)/ cos(1)'。问题不在于它们是否相等,而在于所有浏览器/机器中的tan(x)'对于某些'x'总是完全相同。答案仍然是否定的,但与浮点不准确无关 - 这是因为'tan(x)'没有在javascript中精确定义,并且因为IEEE-754允许扩展精度计算。如果这两件事情不是真的,答案会是肯定的,它总是一样的。 – 2012-04-27 14:49:02

0

我的两分钱 - @goldilocks笔记和其他人暗示你不应该在浮点数上使用==或!=。那么,“确定性”是什么意思?在不同的机器上行为总是一样的?显然这取决于你所说的“同样的行为”。

那么,在“相同”的愚蠢文字层次上,当然不是,物理位在例如“ 32位与64位机器。所以这个解释就没有了。

好吧,任何程序在两台不同的机器上运行相同的输出?在一般的语言中不可以,因为C程序可以对未定义的内存做一些事情,比如从未初始化的位读取。

好吧,那么有效程序在不同的机器上做同样的事情?那么,我会说在浮点数上使用==和!=的程序与读取未初始化内存的程序一样无效。我个人不知道Javascript标准是否会抛出==和!=在浮点数上的行为,以至于如果不是kooky,它的定义非常明确,所以如果这是您确切的问题,您将不得不看到其他答案。你可以编写相对于标准而言未定义输出的JavaScript代码吗?不要阅读标准(其他答案在某种程度上涵盖了这一点),但出于我的兴趣,这是没有实际意义的,因为那些会产生你所谓的不确定行为的程序是无效的。

相关问题