从 sum() 和 '+' 获得不同的结果

Bog*_*aso 4 r sum

下面是我的实验:

> xx = 293.62882204364098
> yy = 0.086783439604999998
> print(xx + yy, 20)
[1] 293.71560548324595175
> print(sum(c(xx,yy)), 20)
[1] 293.71560548324600859
Run Code Online (Sandbox Code Playgroud)

对我来说很奇怪的是,sum()+两者应用于相同的数字时,会给出不同的结果。

这个结果是预期的吗?

我怎样才能得到相同的结果?

哪一种最有效率?

Ben*_*ker 5

这里有一个r-devel 线程,其中包含一些实现的详细描述。特别是托马斯·卡利贝拉 (Tomas Kalibera) 的观点

R 使用 long double 类型作为累加器(在可用的平台上)。?sum 中也提到了这一点:“在可能的情况下使用扩展精度累加器,通常受到 C99 和更新版本的良好支持,但可能依赖于平台。”

这意味着它sum()更准确,尽管这带有一个巨大的闪烁警告信号,如果这种精度水平对您很重要,您应该非常担心计算的实现[在算法和底层数值实现方面] 。

我在这里回答了一个问题,我最终发现(在一些错误的开始之后)+和之间的差异sum()是由于使用了扩展精度sum()

此代码显示各个元素的总和(如在 C 中sum(xx,yy)与 (C) 一起相加+,而此代码用于对各个分量求和;第 154 行 ( LDOUBLE s=0.0) 显示累加器以扩展精度存储(如果可用)。

我相信 @JonSpring 的计时结果可能可以通过 (1) 进行解释(但很乐意予以纠正),sum(xx,yy)将比 ; 进行更多的处理、类型检查等+。(2)sum(c(xx,yy))会稍微慢一些,sum(xx,yy)因为它在扩展精度下工作。