[net.unix-wizards] Why the C-Compiler SHOULD Do That.

george (01/14/83)

References: seismo.194 uvacs.377 cca.4250


There seems to be a perpetuation of errors on this subject.
I hope to clarify the issues here.

1.	Floating point arithmetic is not associative.

2.	I assume that floating point arithmetic (on many machines)
	is commutative.

3.	The grouping of floating point arithmetic operators
	is defined for the C language.
	This may be determined by parentheses, precedence,
	and grouping within a precedence level.
	An expression may be replaced by another which
	is mathematically equivalent with respect to
	associativity or commutativity.

	Unfortunately the "C Reference Manual" seems to formally
	use one operator for both fixed point and floating
	point interpretations.
	Technically multiplication and addition are not
	associative in the C language because they are not
	associative in their floating point contexts.
	Section 7. of "C Reference Manual" says:

		"Expressions involving a commutative and
		associative operator (*, +, |, ^) may be
		rearranged arbitrarily, even in the prescence
		of parentheses; to force a particular order
		of evaluation an explicit temporary must
		be used."

	The listing of "*" and "+" there must have been an error.
	Some compilers seem to take the reasonable liberty
	of treating multiplication and addition as associative
	operators when restricted to fixed point contexts.

4.	Order of evaluation may be undefined.
	Presumably sub-expressions should be evaluated
	in such a way that does not violate the meaning
	of the expression grouping, which is not subject
	to dynamic interpretation.


			George Rosenberg
			duke!mcnc!idis!george
			decvax!idis!george