Re: Forth PARANOIA
- From: Thomas Pornin <pornin@xxxxxxxxx>
- Date: 22 May 2009 11:42:03 GMT
According to Andrew Haley <andrew29@xxxxxxxxxxxxxxxxxxxxxxx>:
Perhaps. C99 says: "The pow functions compute x raised to the power
y. A domain error occurs if x is finite and negative and y is finite
and not an integer value. A domain error may occur if x is zero and y
is less than or equal to zero. A range error may occur." This seems
sensible.
As a point of comparison, here is what Java states about the Math.pow()
function:
public static double pow(double a,
double b)
Returns the value of the first argument raised to the power of the
second argument. Special cases:
* If the second argument is positive or negative zero, then the
result is 1.0.
* If the second argument is 1.0, then the result is the same as
the first argument.
* If the second argument is NaN, then the result is NaN.
* If the first argument is NaN and the second argument is nonzero,
then the result is NaN.
* If:
- the absolute value of the first argument is greater than 1
and the second argument is positive infinity, or
- the absolute value of the first argument is less than 1
and the second argument is negative infinity,
then the result is positive infinity.
* If:
- the absolute value of the first argument is greater than 1
and the second argument is negative infinity, or
- the absolute value of the first argument is less than 1
and the second argument is positive infinity,
then the result is positive zero.
If the absolute value of the first argument equals 1 and the
second argument is infinite, then the result is NaN.
* If:
- the first argument is positive zero and the second
argument is greater than zero, or
- the first argument is positive infinity and the second
argument is less than zero,
then the result is positive zero.
* If:
- the first argument is positive zero and the second
argument is less than zero, or
- the first argument is positive infinity and the second
argument is greater than zero,
then the result is positive infinity.
* If:
- the first argument is negative zero and the second
argument is greater than zero but not a finite odd
integer, or
- the first argument is negative infinity and the second
argument is less than zero but not a finite odd integer,
then the result is positive zero.
* If:
- the first argument is negative zero and the second
argument is a positive finite odd integer, or
- the first argument is negative infinity and the second
argument is a negative finite odd integer,
then the result is negative zero.
* If:
- the first argument is negative zero and the second
argument is less than zero but not a finite odd integer,
or
- the first argument is negative infinity and the second
argument is greater than zero but not a finite odd
integer,
then the result is positive infinity.
* If:
- the first argument is negative zero and the second
argument is a negative finite odd integer, or
- the first argument is negative infinity and the second
argument is a positive finite odd integer,
then the result is negative infinity.
* If the first argument is finite and less than zero:
- if the second argument is a finite even integer, the
result is equal to the result of raising the absolute
value of the first argument to the power of the second
argument
- if the second argument is a finite odd integer, the result
is equal to the negative of the result of raising the
absolute value of the first argument to the power of the
second argument
- if the second argument is finite and not an integer, then
the result is NaN.
* If both arguments are integers, then the result is exactly equal
to the mathematical result of raising the first argument to the
power of the second argument if that result can in fact be
represented exactly as a double value.
(In the foregoing descriptions, a floating-point value is considered
to be an integer if and only if it is finite and a fixed point of
the method ceil or, equivalently, a fixed point of the method floor.
A value is a fixed point of a one-argument method if and only if the
result of applying the method to the value is equal to the value.)
The computed result must be within 1 ulp of the exact result.
Results must be semi-monotonic.
Whether this specification is good or not is arguable. It has some
shortcomings; e.g., it has the ability to destroy a NaN with an exponent
of 0.0 (either +0.0 or -0.0), which I think is quite opposite to the
very purpose of NaN. Nonetheless, this documentation illustrates that
there many special cases to specify or at least worry about with the
pow() function (Java, with its "compile once, run everywhere" dogma,
tends to [over-]specify, as shown above).
--Thomas Pornin
.
- Follow-Ups:
- Re: Forth PARANOIA
- From: Andrew Haley
- Re: Forth PARANOIA
- References:
- Forth PARANOIA
- From: Krishna Myneni
- Re: Forth PARANOIA
- From: Ed
- Re: Forth PARANOIA
- From: Andrew Haley
- Forth PARANOIA
- Prev by Date: Re: What is meta-compilation?
- Next by Date: Re: Forth PARANOIA
- Previous by thread: Re: Forth PARANOIA
- Next by thread: Re: Forth PARANOIA
- Index(es):
Relevant Pages
|
Loading