[Trilinos-Users] Floating-point arithmetic is non-associative
Conjeepuram Subramanian, Natarajan
C.S.Natarajan at bp.com
Wed Jun 15 14:59:27 MDT 2011
Mark,
Thanks for the response and making the question more
understandable! This cleared a misconception I have been carrying; I do
need to read the standards a lot better too!
Thanks again,
C.S.N
-----Original Message-----
From: trilinos-users-bounces at software.sandia.gov
[mailto:trilinos-users-bounces at software.sandia.gov] On Behalf Of Mark
Hoemmen
Sent: Wednesday, June 15, 2011 1:44 PM
To: Conjeepuram Subramanian, Natarajan
Cc: Heroux, Michael A; trilinos-users at software.sandia.gov
Subject: Re: [Trilinos-Users] Floating-point arithmetic is
non-associative
On Jun 15, 2011, at 10:53 AM, Conjeepuram Subramanian, Natarajan wrote:
> Mark, I understand your logic about FP arithmetic not being
associative
> and that being the reason for different answers but I am still a
little
> unsure how you can guarantee it to be commutative?
The IEEE floating-point standard guarantees commutativity of individual
operations. See e.g., IEEE 754-2008, Section 10.4. Specifically, a+b
and b+a should always produce the same answer on the same machine when
run twice. This was true before IEEE 754-1985 except for a few
anomalous machines.
Combinations of operations may result in apparent non-commutative
behavior, depending on how rounding is performed. (a*b) + (c*d) will
produce the same result as (c*d) + (a*b) on the same machine and
compiler, but different results on different machines or compilers,
depending on how rounding is done. See e.g., F. Ris, E. Barkmeyer, C.
Schaffert, & P. Farkas 1993. (Factors causing this include 80-bit vs.
64-bit temporaries, and fused multiply-add.)
> I am going to be an ignoramus and ask a naive question.
> Say a reduce with 3 procs, predefined op. as product and values a(p0),
> b(p1), c(p2). a, c very large and b very small (All floats with ac >
> max(float) and ab and bc <<< max(float)). I would think this would
work
> and give correct results only if a, b, and c are in procs 0, 1, and 2
or
> some good combination thereof where the prod. ac is guaranteed to be
not
> computed before ab/bc!
>
> Is this not correct? As I know all predefined operations are assumed
to
> be both associative and commutative and you can turn of commutative by
> creating your own op. but not associative. so in this case would the
> previous example be considered a case of non-associative behaviour?
Yes, it would be, if I understand correctly. Let me restate your
question, just to make sure that I understand:
1. a and c are very large, and b is very small. a, b, c > 0.
2. In particular, fl(ac) = Inf, fl(ab) < Inf, fl(bc) < Inf.
3. Compute a*b*c.
Associativity, or the lack thereof, relates to the choice of
parenthesization: (ab)c vs. a(bc). Commutativity only comes into play
if you rearrange the terms in the product. However, you can't get (ac)b
(for example) without using associativity as well. For example:
a(bc) -> a(cb) (commutativity) -> (ac)b (associativity)
(ab)c -> (ba)c (commutativity) -> b(ac) (associativity) -> (ac)b
(commutativity)
A simpler example of non-associative floating-point behavior would be
this: let e = (machine precision / 2). Let fl( x+y ) denote the
floating-point representation of the result of x + y, where x and y each
can be represented exactly in floating-point arithmetic (fl(x) = x,
fl(y) = y). Then fl( (1+e) + e ) = 1, but fl( 1+(e+e) ) = 1 + 2e != 1.
mfh
_______________________________________________
Trilinos-Users mailing list
Trilinos-Users at software.sandia.gov
http://software.sandia.gov/mailman/listinfo/trilinos-users
More information about the Trilinos-Users
mailing list