3

いくつかの行列乗算演算をチェックしているときに、奇妙な動作に遭遇しました。「手で」(積と和を使用して) 乗算を実行した場合と、行列乗算演算子 %*% を使用した場合とでは、異なる結果が得られます。

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 (たとえば、 a <- 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

なぜこれが起こっているのですか?

ありがとう、ペドロ

4

1 に答える 1

2

%*%は結果をわずかに異なる方法で計算します。つまり、さまざまな場所でさまざまな丸め誤差が発生し、全体的な結果が異なります。

推測にすぎませんが、これはアキュムレータをマシンの浮動小数点レジスタに保持していることが原因であると考えられますsumこれは、Intel アーキテクチャで80 ビットの拡張精度を備えています。確実に知りたい場合は、R のアセンブリ コードを調べる必要があります。

于 2012-12-07T13:05:40.810 に答える