- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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 实现使用不同的精度来计算中间浮点表达式。通常,这可以通过编译器开关或通过在表达式中包含强制转换和赋值来控制,以要求舍入到标称类型(从而丢弃多余的精度)。
但是,更复杂的函数,例如 exp
和 cos
,通常无法在不同平台上重现。尽管 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/
许多书籍都使用下图来说明 Fisher 线性判别分析的思想(该图来自 Pattern Recognition and Machine Learning,第 188 页) 我想知道如何用 R(或任何其他
我想淡入 UITextField 的边框,因此我自己在 UIView 中使用其图层重新创建它: borderView = [[UIView alloc] initWithFrame:CGRec
我希望有人能指出我正确的方向。首先,我不是统计学家。我是一名软件开发人员,我的任务是尝试使用 R 重现 SPSS 因子分析的结果(使用 PC 提取和方差最大旋转)。我在过去一周只接触过 R,所以我试图
我正在尝试使用我用 C 编写的小程序重现 .raw 图像文件,但每次运行该程序时,我的输出文件都变得不可读。 我的程序所做的就是获取每个像素并将其写入相应的输出文件。 另请注意,该程序仅支持灰度图像。
我想在 R 中实现以下 SAS 代码。 $$N_e = N_o{1-exp[\frac{(d+bN_o)(T_h N_e - T)}{(1+c N_o)}]}$$ 其中 $b>0$、$c\geq 0$
我正在尝试重现 dlib 的 frontal_face_detector() 的训练过程。 我正在使用相同的数据集(来自 http://dlib.net/files/data/dlib_face_de
我们在生产环境中遇到过一些异常: UnknownTopicOrPartitionException: This server does not host this topic-partition 根据
我正在尝试在 Matlab 中实现一个颜色条,它在以灰色打印时看起来是线性的。我认为最直接的方法是实现 gnuplot pm3d 30,31,32 RGB 色彩空间。在 this website我找到
我是一名优秀的程序员,十分优秀!