Neil N. Carlson wrote:
...
> Exponentiation with integer exponents is defined algebraically
> without any need to refer to transcendental functions (how the
> exponential result is ultimately calculated is quite aside the
> point): x**3 means x*x*x, x**(-2) means 1.0/(x*x) provided
> x/=0, and
This is the definition of the power operator in Fortran if X is
of type INTEGER. If X is not type INTEGER (regardless
of its value), then this is not the definition of the power
operator.
If the type of X is COMPLEX, the standard mentions that the
answer must be the "principal value" of the result (without defining
that phrase).
The Fortran power operator doesn't otherwise have any required
semantics. Like all other operators (aside from integer divide), the
operation is implementation defined.
If you want to have portably reliable answers to your other
questions, I would recommend you resort to other standards
than the Fortran language standard. The language independent
arithmetic standard comes to mind (ISO/IEC 10967-2).
> o it is mathematical convention that x**0 is defined to be 1
> for ANY x, including x=0.0 (Whether 0.0**0.0 means anything
> is a different question.)
My (old) copy of the LIA working doc says that 0.0**I is undefined
for I <= 0.
> o When y = real(n) for some integer n/=0, x**y is well-defined
> (mathematically) for x<0 (and x=0 if y>0), and so then
> shouldn't x**y return the result for x**n?
Again, my LIA doc says X**Y is undefined for REAL Y and X < 0.
> o If one grants the above point, then I see no reason that the
> above reasoning wouldn't apply equally well to the case n=0
> (i.e., y = 0.0), so that x**0.0 is 1 for any x/=0, but also
> that 0.0**0.0 is 1. This last bit is disturbing though
> because x**y has no limit as x,y->0.
My old copy of the LIA doc says that 0.0 ** Y is undefined
for REAL Y <= 0.0.
Now, my document is old, and they may have changed their
minds. But I doubt it. The sequence of operations used to
evaluate these things should not require differences of semantics
based on *exact* equality to integer values. If a sequence of
operations generates a rounded result that just happens to be
equal to an integer and that's subsequently used as an exponent
you would have it treated as semantically distinct from an
exponent that might have been computed more accurately
and is *not* integral by a few ULPs.
--
J. Giles
"I conclude that there are two ways of constructing a software
design: One way is to make it so simple that there are obviously
no deficiencies and the other way is to make it so complicated
that there are no obvious deficiencies." -- C. A. R. Hoare
|