-->

在Javascript中浮点数的精度可以不确定性的来源?(Can precision of floa

2019-07-29 04:02发布

同样的数学运算可以返回不同的体系结构或浏览器不同的结果?

Answer 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,日志,战俘,罪恶,开方,棕褐色不正是在这里指定...

这意味着,这些都是至少某些情况下, 对数运算的结果是实现相关的,因此可能是不一致的。



Answer 2:

其他的答案是不正确的。 根据ECMAScript的5.1规格 (15.8.2节)

注:该功能ACOS的行为,ASIN,ATAN,ATAN2,COS,EXP,日志,战俘,罪恶,开方,棕褐色不正是这里只是其中要求对代表的利益边界情况某些参数值的具体结果。

...

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


然而,即使指定的实现中, 所有浮点运算的准确结果仍然是依赖于浏览器/架构。 其中包括像乘法和除法简单的操作!

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

这是一个针对网络对等网络游戏的大问题 ,因为这意味着,如果更高的精度计算不能被禁用(如对于C#的情况下),这些游戏几乎不能使用浮点运算在所有。 然而,这通常是没有为Javascript游戏的问题,因为它们通常是客户端 - 服务器。



Answer 3:

如果我们假设每一个浏览器厂商遵循IEEE标准ECMA +规格并没有实现,而没有人为错误,没有不能有任何区别。



Answer 4:

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

那么,在一个傻字面水平“一样,”当然不是,物理位将在例如32位与64位的机器不同。 这样的解释是出来。

好了,将任何程序与两个不同的机器相同的输出运行? 在一般的语言否定的,因为一个C程序可以从一个未初始化的位做一些与不确定的记忆,就像读。

好了,将任何有效的程序做同样的事情在不同的机器? 好吧,我会说,使用==和程序!=上浮点数是作为一个程序读取未初始化的内存为无效。 我个人不知道JavaScript标准锤出来==的行为,!=彩车上向它如果不是古怪的明确定义,所以如果这是你确切的问题,你必须看到其他的答案点。 你可以写一个尚未定义的输出相对于标准的JavaScript代码? 从来没有读过标准(其他答案涵盖这有点),但对我的兴趣,因为这会产生什么样的你叫undeterministic行为的程序是无效的开始,这是没有实际意义。



文章来源: Can precision of floating point numbers in Javascript be a source of non determinism?