14

相同的数学运算能否在不同的架构或浏览器中返回不同的结果?

4

4 回答 4

15

其他答案不正确。根据ECMAScript 5.1 规范(第 15.8.2 节)

注意这里没有精确指定函数 acos、asin、atan、atan2、cos、exp、log、pow、sin、sqrt 和 tan 的行为,除非需要对表示感兴趣的边界情况的某些参数值的特定结果。

...

尽管算法的选择留给实现,但建议(但本标准未指定)实现使用 fdlibm 中包含的 IEEE 754 算法的近似算法,fdlibm 是 Sun Microsystems 的可免费分发的数学库


但是,即使指定了实现所有浮点运算的确切结果仍将取决于浏览器/架构。 这包括简单的操作,如乘法和除法!!

原因是 IEEE-754 允许系统以比结果更高的精度进行 64 位浮点计算,导致舍入结果与使用与结果相同精度的系统不同。这正是x86(英特尔)架构所做的,这就是为什么在 C(和 javascript)中我们有时cos(x) != cos(y)甚至x == y可以在同一台机器上拥有!

对于联网的点对点游戏来说是一个大问题,因为这意味着,如果不能禁用更高精度的计算(如 C# 的情况),这些游戏几乎不能使用浮点计算一点也不。 但是,这对于 Javascript 游戏通常不是问题,因为它们通常是客户端-服务器。

于 2012-04-26T17:14:10.080 回答
3

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

于 2012-04-26T13:48:34.563 回答
1

尽管 ECMAScript 语言规范 5.1 版声明数字是对应于 IEEE 754 浮点数的原始值,这意味着计算应该是一致的:

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

4.3.19 数值

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

注意 Number 值是 Number 类型的成员,是数字的直接表示。

正如BlueRaja指出的那样,第 15.8.2 节中有一种警告:

函数 acos、asin、atan、atan2、cos、exp、log、pow、sin、sqrt 和 tan 的行为在这里没有精确说明......

这意味着,至少在某些情况下,数字操作的结果取决于实现,因此可能不一致。

于 2012-04-26T13:52:15.657 回答
0

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

好吧,在一个愚蠢的“相同”字面上,当然不是,物理位在例如 32 位和 64 位机器上会有所不同。所以这个解释出来了。

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

好的,那么任何有效的程序都会在不同的机器上做同样的事情吗?好吧,我想说在浮点数上使用 == 和 != 的程序与读取未初始化内存的程序一样无效。我个人不知道 Javascript 标准是否将 == 和 != 在浮点数上的行为确定为即使不古怪也可以定义明确的程度,因此,如果这是您的确切问题,则必须查看其他答案. 你能写出与标准相关的未定义输出的 javascript 代码吗?永远不要阅读标准(其他答案在某种程度上涵盖了这一点),但出于我的兴趣,这是没有实际意义的,因为会产生你所谓的不确定行为的程序一开始是无效的。

于 2012-04-26T22:33:17.913 回答