相同的数学运算可以在不同的体系结构或浏览器中返回不同的结果吗?JavaScript中的浮点数的精度是否是非确定性的来源?
回答
虽然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,日志, 战俘,罪恶,开方,棕褐色不正是在这里指定...
意义,这些都是至少某些情况下,操作对数字结果是实现相关的,因此可能是不一致的。
我没有任何特定的代码,只是想知道... – 2012-04-26 13:55:55
不正确。看到我的答案。 – 2012-04-26 21:50:48
这个答案不正确。即使x和y相同,同一台机器也可以为像x + y这样的操作返回不同的结果。 BlueRaja的答案是正确的。 – lacker 2012-05-04 19:00:05
如果我们假设每个浏览器供应商都遵循标准+ ECMA规范并且在实施时没有人为错误,那么不会有任何区别。
是啊,如果他们遵守标准,他们都表现在标准的方式。无论如何,不符合IEEE/ECMA的浏览器可能都不值得使用。 – Romain 2012-04-26 13:50:28
啊,现在你已经添加了“ECMA”,我可以删除我的答案,并upvote你的。 =)读者的更多信息:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf指定了所有ECMAscript数字必须如何表现,通常根据各种IEEE规范。 – ninjagecko 2012-04-26 13:52:29
错误。看到我的答案。 – 2012-04-26 21:50:56
其他回答都是错误的。按照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游戏的问题,因为它们通常是客户端服务器。
伟大的文章 - 但:通常(因为不精确)使用==或!=与浮游物不是一个好主意。然而,这并不意味着你不能使用浮点数,它只是意味着,不要使用==或!=,而是使用比较<= > =针对任何精度定制的范围。 – delicateLatticeworkFever 2012-04-26 21:58:47
@goldilocks是正确的,事实上(Math.tan(1)== Math.sin(1)/Math.cos(1))产生false ... – 2012-04-27 11:58:23
@João:是的,但是这与您的问题是正交的。每个人都知道,由于浮点不准确,我们可能有'tan(1)!= sin(1)/ cos(1)'。问题不在于它们是否相等,而在于所有浏览器/机器中的tan(x)'对于某些'x'总是完全相同。答案仍然是否定的,但与浮点不准确无关 - 这是因为'tan(x)'没有在javascript中精确定义,并且因为IEEE-754允许扩展精度计算。如果这两件事情不是真的,答案会是肯定的,它总是一样的。 – 2012-04-27 14:49:02
我的两分钱 - @goldilocks笔记和其他人暗示你不应该在浮点数上使用==或!=。那么,“确定性”是什么意思?在不同的机器上行为总是一样的?显然这取决于你所说的“同样的行为”。
那么,在“相同”的愚蠢文字层次上,当然不是,物理位在例如“ 32位与64位机器。所以这个解释就没有了。
好吧,任何程序在两台不同的机器上运行相同的输出?在一般的语言中不可以,因为C程序可以对未定义的内存做一些事情,比如从未初始化的位读取。
好吧,那么有效程序在不同的机器上做同样的事情?那么,我会说在浮点数上使用==和!=的程序与读取未初始化内存的程序一样无效。我个人不知道Javascript标准是否会抛出==和!=在浮点数上的行为,以至于如果不是kooky,它的定义非常明确,所以如果这是您确切的问题,您将不得不看到其他答案。你可以编写相对于标准而言未定义输出的JavaScript代码吗?不要阅读标准(其他答案在某种程度上涵盖了这一点),但出于我的兴趣,这是没有实际意义的,因为那些会产生你所谓的不确定行为的程序是无效的。
- 1. 限制JavaScript中的浮点数精度
- 2. JavaScript是否具有双浮点数精度?
- 3. 跨iOS设备的浮点确定性是否确定?
- 4. 任意精度JavaScript上的浮点数
- 5. 确定浮点数是否是另一个浮点数的倍数?
- 6. 检查一个变量是否是双精度浮点数
- 7. 是否有可能根据它的值来设置DataFrame中的浮点精度?
- 8. JavaScript中的精确浮点运算
- 9. 定义浮点数的精度在Python
- 10. 指定浮点数精度的NSString
- 11. 检查数字是否精确浮点数(int)或实际浮点数
- 12. Apache Spark的非确定性的来源
- 13. python中的浮点精度
- 14. 是什么定义了python中的浮点精度?
- 15. 双浮点数不准确的来源
- 16. 是否有可能以保真度将浮点双精度浮点双精度到两个十进制整数?
- 17. 非确定性来源
- 18. 如何判断双精度浮点数是否可以安全地存储为单精度浮点数?
- 19. 浮点数据类型的15位数字的精确度是什么意思?
- 20. 是否存在浮点三维空间的精确可视化?
- 21. 非常大的浮点数会导致非确定性吗?
- 22. javascript parseFloat无法确定输入是否为浮点数
- 23. 双精度浮点数和其他浮点数精度
- 24. 是否可以打印一个双精度浮点数
- 25. 检查两个浮点数/双精度值是否相等
- 26. 从浮点数中减去的精度
- 27. Swift中的高精度浮点数
- 28. python中精度浮点数的丢失
- 29. c中的浮点数和双精度#
- 30. Haskell中的高精度浮点数?
浮标以神秘的方式移动。 – TJHeuvel 2012-04-26 13:47:40
@TJHeuvel你是什么意思? – 2012-04-26 13:49:05
发布您的代码并找出;) – delicateLatticeworkFever 2012-04-26 13:55:10