在检查一些矩阵乘法运算时,我遇到了一个奇怪的行为。当我“手动”执行乘法(使用乘积和和)并使用矩阵乘法运算符%*%时,我得到不同的结果。
c <- 1:10
a <- 100^(0:9)
p1 <- sum(a*c)
p2 <- a%*%c
p1==p2
[,1]
[1,] FALSE
p1-p2
[,1]
[1,] -2048
但是,当我使用任何其他值(例如,a&lt; - 101 ^ 0:9)时,我会得到相同的结果:
c <- 1:10
a <- 101^(0:9)
p1 <- sum(a*c)
p2 <- a%*%c
p1==p2
[,1]
[1,] TRUE
p1-p2
[,1]
[1,] 0
知道为什么会这样吗?
谢谢你, 佩德罗
答案 0 :(得分:2)
%*%
会以稍微不同的方式计算其结果,这意味着在不同的地方会出现不同的舍入错误,从而导致不同的整体结果。
我只是猜测,但我相信这个可能归因于sum
将其累加器保留在机器浮点寄存器中,该寄存器在英特尔架构上有80 bit extended precision 。如果您想确切知道,则必须查看R的汇编代码。