!standard 4.5.6(11) 08-01-30 AI05-0088-1/01
!class binding interpretation 08-01-30
!status ARG Approved 8-0-1 08-02-10
!status work item 08-01-30
!status received 08-01-25
!priority Low
!difficulty Medium
!qualifier Omission
!subject Only the value of "**" is equivalent to repeated "*"s
!summary
The equivalence in 4.5.6(11) only means that the value (and its accuracy) is
equivalent, not that any side-effects of such an expansion need be done.
!question
4.5.6(11) says:
The right operand of an exponentiation is the exponent. The expression
X**N with the value of the exponent N positive is equivalent to the expressions
X*X*...X (with N-1 multiplications) except that the multiplications are
associated in an arbitrary order.
If X is a volatile or atomic variable, is the implementation required to
read it N times? (No.)
If X is a function call with side effects, is the implementation required to
call the function N times? (No.)
!recommendation
(See summary.)
!wording
Change 4.5.6(11) as follows:
The right operand of an exponentiation is the exponent. The {value of}
[expression] X**N with the value of N positive is [equivalent to the expressions]
{the same as the value of} X*X*...X (with N-1 multiplications) except that
the multiplications are associated in an arbitrary order. ...
!discussion
This is just another case where "equivalent" really means "the same, other than
when they are different".
!corrigendum 4.5.6(11)
@drepl
The right operand of an exponentiation is the @i. The expression X**N
with the value of the exponent N positive is equivalent to the expression
X*X*...X (with N–1 multiplications) except that the multiplications are
associated in an arbitrary order. With N equal to zero, the result is one.
With the value of N negative (only defined for a floating point operand),
the result is the reciprocal of the result using the absolute value of N
as the exponent.
@dby
The right operand of an exponentiation is the @i. The value of X**N
with the value of the exponent N positive is the same as the value of
X*X*...X (with N–1 multiplications) except that the multiplications are
associated in an arbitrary order. With N equal to zero, the result is one.
With the value of N negative (only defined for a floating point operand),
the result is the reciprocal of the result using the absolute value of N
as the exponent.
!ACATS Test
None is needed for this; hopefully no one is depending on these sorts of side effects.
!appendix
From: Robert A. Duff
Sent: Friday, January 25, 2008 7:06 PM
Here's an entertaining question Robert Dewar came up with.
Suppose we say X**N, where N is positive.
RM-4.5.6 says:
11 {exponent} The right operand of an exponentiation is the exponent. The
expression X**N with the value of the exponent N positive is equivalent to the
expression X*X*...X (with N-1 multiplications) except that the multiplications
are associated in an arbitrary order.
If X is a volatile or atomic variable, is the implementation required to
read it N times? (No!)
And Gary Dismukes piled on with this follow-on question:
If X is a function call with side effects, is the implementation required to
call the function N times? (No!)
I guess this is another one of those cases where "equivalent" really means
"the same, only different".
Clearly X should be evaluated exactly once (and read exactly once if volatile).
Same for N.
How about:
11 {exponent} The right operand of an exponentiation is the exponent. The
value of X**N with N positive is the same as the
value of X*X*...X (with N-1 multiplications) except that the multiplications
are associated in an arbitrary order.
?
And I presume it's safe to assume we're talking about the predefined "**",
here -- user-defined "**" is not "equivalent" to N "*" ops!
****************************************************************