首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >浮点算法与重现性

浮点算法与重现性
EN

Stack Overflow用户
提问于 2014-01-19 01:56:26
回答 1查看 2.2K关注 0票数 11

IEEE-754算术可在不同平台上复制吗?

我在测试一些用R写的代码,它使用随机数。我认为在所有测试平台上设置随机数生成器的种子将使测试具有可重复性,但对于生成指数分布随机数的rexp()来说似乎并非如此。

这就是我在32位Linux上得到的:

代码语言:javascript
复制
options(digits=22) ; set.seed(9) ; rexp(1, 5)
# [1] 0.2806184054728815824298
sessionInfo()
# R version 3.0.2 (2013-09-25)
# Platform: i686-pc-linux-gnu (32-bit)

这就是我在64位OSX 10.9上得到的信息:

代码语言:javascript
复制
options(digits=22) ; set.seed(9) ; rexp(1, 5)
# [1] 0.2806184054728815269186
sessionInfo()
# R version 3.0.2 (2013-09-25)
# Platform: x86_64-apple-darwin10.8.0 (64-bit)

64位Linux提供与64位OSX相同的结果,因此这似乎是32位对64位的问题。

让我们假设两个R版本都是使用相同的GCC版本编译的,并且具有相同(默认的R)编译标志,这使得编译器使用IEEE-754算法。

我的问题是,这能被认为是R中的一个缺陷吗?还是仅仅是使用近似有限精度浮点算法的“正常”结果?

我向R-devel邮件列表发送了同样的问题,但列表上没有答案,只有一个私下的回答,试图说服我这不是一个bug,我应该接受它。

这就是IEEE-754对可复制性的看法(来自维基百科):

IEEE 754-1985允许实现中的许多变化(例如一些值的编码和某些异常的检测)。IEEE 754-2008已经收紧了其中的许多,但仍有一些变化(特别是二进制格式)。“可再现性”条款建议,语言标准应提供一种方法来编写可复制的程序(即在所有语言实现中产生相同结果的程序),并说明需要做些什么才能实现可再现的结果。

这是在“建议”之下。

我(主观)的观点是,这是一个缺陷,因为IEEE-754标准的全部要点是具有可重现性的、与平台无关的浮点算法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-19 02:04:58

在高级语言中,即使是基本浮点操作的重现性也存在问题,但它们通常可以通过各种特定于平台的操作来控制,例如设置编译器开关、使用自定义代码设置浮点控件和模式,或者在必要时在程序集中编写基本操作。正如在注释中开发的那样,您遇到的具体问题可能是不同的C实现使用不同的精度来计算中间浮点表达式。通常,这可以通过编译器开关或在表达式中包含强制转换和赋值来控制,以要求舍入到标称类型(从而放弃多余的精度)。

然而,更复杂的功能,如expcos,在不同的平台上并不是常规的可复制的。尽管2008 IEEE-754标准建议使用正确的四舍五入来实现这些函数,但是对于具有已知界限的运行时的数学库,这个任务还没有完成。世界上没有人做过数学来做到这一点。

CRlibm项目已经用已知的运行时界限实现了一些函数,但是工作还不完整。(根据Pascal的评论,当CRlibm没有经过验证的正确舍入的运行时限制时,由于计算精度很高,结果很有可能被正确舍入。)找出如何在一个有限制的时间内提供一个正确的结果,并证明它对于许多函数来说是困难的。(请考虑如何证明cos(x)的值(其中x是任何double值)比与两个可表示值之间的中点距离较小的e更接近。中点很重要,因为舍入必须从返回一个结果更改为返回另一个结果,e告诉您,为了提供正确的四舍五入,必须精确地计算近似。)

当前的情况是,数学库中的许多函数都是近似的,一些精度比正确的舍入更宽松,不同的供应商使用不同的近似实现。我假设R在其rexp实现中使用其中的一些函数,并且它使用目标平台的本机库,因此在不同的平台上得到不同的结果。

要解决这个问题,您可以考虑在目标平台(可能是CRlibm)上使用一个通用的数学库。

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21212326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档