下面是我的实验:
> 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()
当+
两者应用于相同的数字时,会给出不同的结果。
这个结果是预期的吗?
我怎样才能得到相同的结果?
哪一种最有效率?
这里有一个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)
因为它在扩展精度下工作。