[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Old Question



Ben Tupper wrote:
> 
> Jacques Basson wrote:
> 
> > Hi all
> >
> > Sorry, this has got to be an old question, but I can't seem to locate
> > the answer.  What is the way around the following problem?
> >
> > IDL> a = -1
> > IDL> print, -1^(1./3)
> >      -1.00000
> > IDL> print, a^(1./3)
> >           NaN
> > % Program caused arithmetic error: Floating illegal operand
> >
> > Thanks
> > Jacques
> 
> Hello,
> 
> I now know why it happens.  In the documentation I see...
> 
> Exponentiation
> 
> The caret (^) is the exponentiation operator. A^B is equal to A raised to
> the B power.
> 
>  If A is a real number and B is of integer type, repeated multiplication
> is applied.
>  If A is real and B is real (non-integer), the formula A^B = e^(B ln A)
> is evaluated.
>  If A is complex and B is real, the formula A^B = (re^(iq))^B = r^B *
> (cosBq + isinBq) (where r is the real part of A and iq is the imaginary
> part) is evaluated.
> 
>  If B is complex, the formula A^B = e^(B ln A) is evaluated. If A is
> also complex, the natural logarithm is computed to be ln(A) = ln(re^(iq))
> = ln(r) + iq (where r is the real part of A and iq is the imaginary
> part).
>  A^0 is defined as 1.
> 
> Your example falls into the second type of operation.   I don't know how
> to get around that but would like to know also.
> 
> Ben
> 
> --
> Ben Tupper
> Pemaquid River Company
> 248 Lower Round Pond Road
> POB 106
> Bristol, ME 04539
> 
> Tel: (207) 563-1048
> Email: PemaquidRiver@tidewater.net

I resorted to creating a simple function which basically does
	abs(a)^(1./3) * (2*(a gt 0) - 1)
Slightly messy, but it works.

Jacques