gpt4 book ai didi

r - 浮点运算和再现性

转载 作者:行者123 更新时间:2023-12-02 04:10:45 26 4
gpt4 key购买 nike

IEEE-754 算术可以在不同平台上重现吗?

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

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

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 上得到的结果:

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 邮件列表发送了同样的问题,但列表上没有答案,只有一个私下答案,试图让我相信这不是一个错误,我应该接受它。

这是 IEEE-754 关于再现性的说法(来自维基百科):

The IEEE 754-1985 allowed many variations in implementations (such as the encoding of some values and the detection of certain exceptions). IEEE 754-2008 has tightened up many of these, but a few variations still remain (especially for binary formats). The reproducibility clause recommends that language standards should provide a means to write reproducible programs (i.e., programs that will produce the same result in all implementations of a language), and describes what needs to be done to achieve reproducible results.

这是在“建议”下。

我(主观)认为这是一个错误,因为 IEEE-754 标准的重点是具有可重复的、独立于平台的浮点运算。

最佳答案

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

但是,更复杂的函数,例如 expcos,通常无法在不同平台上重现。尽管 2008 年 IEEE-754 标准建议通过正确舍入来实现这些函数,但对于运行时具有已知界限的任何数学库来说,尚未完成此任务。 世界上没有人通过数学计算来实现这一目标。

CRlibm project已经实现了一些具有已知运行时界限的功能,但工作尚未完成。 (根据 Pascal Cuoq 的评论,当 CRlibm 没有经过验证的正确舍入的运行时界限时,由于计算精度非常高,它会回退到很可能正确舍入的结果。)弄清楚如何提供正确的舍入结果-在有限时间内舍入结果,并且证明这对于许多函数来说是困难的。 (考虑一下如何证明 cos(x) 的值(其中 x 是任何 double 值)没有比某个小距离更近e 从两个可表示值之间的中点开始。中点很重要,因为舍入必须从返回一个结果更改为返回另一个结果,并且 e 告诉您您的准确度和精确度。必须计算近似值才能提供正确的舍入。)

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

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

关于r - 浮点运算和再现性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21212326/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com