Hi Barry,

Shock and horror indeed, addition is not _associative_, at least for floating point arithmetic [1].

Flipping the order of the operands seems to be the explanation of the discrepancies between R and MATLAB as you suggest:

In R:
a = 0.812672
b = 0.916541
c = 0.797810
sprintf('%.30f', a+b+c)
[1] "2.527023000000000241271891354700"
sprintf('%.30f', c+a+b)
[1] "2.527022999999999797182681504637"
sprintf('%.30f', sum(c(a,b,c)))
[1] "2.527022999999999797182681504637"

In MATLAB:
a = 0.812672;
b = 0.916541;
c = 0.797810;
sprintf('%.30f', a+b+c)
ans = 2.527023000000000241271891354700
sprintf('%.30f', c+a+b)
ans = 2.527022999999999797182681504637
sprintf('%.30f', sum([a,b,c]))
ans = 2.527023000000000241271891354700

From this, I'll have to conclude that R's sum() is correct, but probably internally flipping operands.

Many thanks,
Daniel

[1] http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

On 23/08/11 3:20 PM, Barry Rowlingson wrote:
  Its probably to do with the order of summations. With your a,b,c you get:

  >  (a+b+c) == (c+b+a)
  [1] TRUE
  >  (a+b+c) == (c+a+b)
  [1] FALSE

shock horror, addition is not associative[1]. Lets investigate:

  >  sum(c(a,b,c)) == c+a+b
  [1] TRUE
  >  sum(c(a,b,c)) == a+c+b
  [1] TRUE

  'sum' seems to get the same answer as adding the first and the third,
then adding the second - explicitly:

  >  sum(c(a,b,c)) == (a+c)+b
  [1] TRUE

I'm not sure what it would do for four values in the sum. Have fun
finding out. Does matlab similarly have a+b+c != c+b+a?

Barry

[1] or commutative or distributive or one of those -ives you learn one
day in school. Too lazy to wikipedia it right now...

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to