22 May 1999 20:40:59 -0400

Related articles |
---|

Distributivity and types sanjayp@ddi.com (Sanjay Pujare) (1999-05-22) |

Re: Distributivity and types wclodius@aol.com (1999-05-22) |

Re: Distributivity and types adrian@dcs.rhbnc.ac.uk (1999-05-27) |

Re: Distributivity and types anton@mips.complang.tuwien.ac.at (1999-05-27) |

Re: Distributivity and types adrian@dcs.rhbnc.ac.uk (1999-05-29) |

Re: Distributivity and types jonathan_barker@my-deja.com (1999-05-29) |

From: | wclodius@aol.com (Wclodius) |

Newsgroups: | comp.compilers |

Date: | 22 May 1999 20:40:59 -0400 |

Organization: | AOL http://www.aol.com |

References: | 99-05-111 |

Keywords: | optimize, standards, Fortran, comment |

*>Consider the expression*

*>*

*>a*(b+c)*

*>*

*>Because of distributivity this can be changed to*

*>*

*>a*b+a*c*

*>*

*>But I have a question: Can this be done always? What happens when a*

*>is unsigned and (b+c) is signed? Does anybody have any insight into this?*

*>*

*>Thanks.*

*>*

*>Sanjay*

*>[Depends on your language definition. In Fortran, the answer is always*

*>yes, in other languages, sometimes yes, sometimes no. -John]*

In Fortran 95, and I believe all earlier versions of the Fortran

standard the answer is sometimes yes, sometimes no. See section

7.1.7.3. Parentheses, if they make a difference, and they almost

always can in floating point, have to be respected. For integer

arithmetic the answer is more subtle. It is possible that the cases

where parentheses in integer arithmetic can make a difference involve

undefined behavior and the processor may therefore be able to justify

applying distributivity and still be standard conforming.

Note, however, that while Fortran requires respecting parentheses it

does not require respecting the absence of parentheses, i.e., it can

rewrite

a*b + a*c

as

a*(b+c)

but it cannot rewrite

(a*b) + (a*c)

to the same form. Fortran is looser than some other languages, e.g., C, in

allowing commutivity to be exploited.

William B. Clodius

[I went back and checked. Fortran 66 allowed the compiler to substitute

any mathematically equivalent expression regardless of parens, while

Fortran 77 required that parens be honored. -John]

Post a followup to this message

Return to the
comp.compilers page.

Search the
comp.compilers archives again.