|
| ▲ | amluto 7 hours ago | parent | next [-] |
| I think the other replies are overcomplicating this. + is a binary operation, and a+b+c can’t be interpreted without knowing whether one treats + as left-associative or right-associative. Let’s assume the former: a+b+c really means (a+b)+c. If + is commutative, you can turn (a+b)+c into (b+a)+c or c+(a+b) or (commuting twice) c+(b+a). But that last expression is not the same thing as (c+b)+a. Getting there requires associativity, and floating point addition is not associative. |
| |
|
| ▲ | wtallis 10 hours ago | parent | prev | next [-] |
| "a+b+c" doesn't describe a unique evaluation order. You need some parentheses to disambiguate which changes are due to associativity vs commutativity. a+(b+c)=(c+b)+a should be true of floating point numbers, due to commutativity. a+(b+c)=(a+b)+c may fail due to the lack of associativity. |
| |
| ▲ | adastra22 10 hours ago | parent [-] | | It is not, due to precision. Consider a=1.00000, b=-0.99999, and c=0.00000582618. | | |
| ▲ | jcranmer 9 hours ago | parent | next [-] | | No, the two evaluations will give you exactly the same result:
https://play.rust-lang.org/?version=stable&mode=debug&editio... IEEE 754 operations are nonassociative, but they are commutative (at least if you ignore the effect of NaN payloads). | | |
| ▲ | dbdr an hour ago | parent [-] | | Is there a case involving NaN where they are not commutative? Do you mean getting a different bit-level representation of NaN? |
| |
| ▲ | zygentoma 10 hours ago | parent | prev | next [-] | | You still need to specify an evaluation order … | |
| ▲ | immibis 9 hours ago | parent | prev [-] | | Does (1.00000+-0.99999)+0.00000582618 != 0.00000582618+(-0.99999+1.00000) ? This would disprove commutativity. But I think they're equal. |
|
|
|
| ▲ | dataangel 6 hours ago | parent | prev | next [-] |
| For those to be equal you need both associativity and commutativity. Commutativity says that a*b = b*a, but that's not enough to allow arbitrary reordering. When you write a*b*c depending on whether * is left or right associative that either means a*(b*c) or (a*b)*c. If those are equal we say the operation is associative. You need both to allow arbitrary reordering. If an operation is only commutative you can turn a*(b*c) into a*(c*b) or (b*c)*a but there is no way to put a in the middle. |
|
| ▲ | wfleming 9 hours ago | parent | prev | next [-] |
| We’re in very nitpicky terminology weeds here (and I’m not the person you’re replying to), but my understanding is “commutative” is specifically about reordering operands of one binary op (4+3 == 3+4), while “associative” is about reordering a longer chain of the same operation (1+2+3 == 1+3+2). Edit: Wikipedia actually says associativity is definitionally about changing parens[0]. Mostly amounts to the same thing for standard arithmetic operators, but it’s an interesting distinction. [0]: https://en.wikipedia.org/wiki/Associative_property |
| |
| ▲ | nyrikki 9 hours ago | parent [-] | | It is not a nit it is fundamental, a•b•c is associativity, specifically operator associativity. Rounding and eventual underflow in IEEE means an expression X•Y for any algebraic operation • produces, if finite, a result (X•Y)·( 1 + ß ) + µ where |µ| cannot exceed half the smallest gap between numbers in the destination’s format, and |ß| < 2^-N , and ß·µ = 0 . ( µ ≠ 0 only when Underflow occurs.) And yes that is a binary relation only a•b•c is really (a•b)•c assuming left operator associativity, one of the properties that IEEE doesn't have. |
|
|
| ▲ | nyrikki 10 hours ago | parent | prev [-] |
| IEEE 754 floating-point addition and multiplication are commutative in practice, even if there are exceptions with NaNs etc.. But remember that commutative is on the operations (+,x) which are binary operations, a+b=b+a and ab=ba, you can get accumulated rounding errors on iterated forms of those binary operations. |