MathGroup Archive 2006

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Bug in calculating -3^49999.0

  • To: mathgroup at smc.vnet.net
  • Subject: [mg66034] Re: [mg65989] Bug in calculating -3^49999.0
  • From: Daniel Lichtblau <danl at wolfram.com>
  • Date: Thu, 27 Apr 2006 02:26:38 -0400 (EDT)
  • References: <200604260837.EAA02684@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

kowald at molgen.mpg.de wrote:
> Hello everybody,
> 
> I'm using Mathematica 5.1 under Win2k and I found a bug when I try to compute
> -3^49999. I get:
> 
> -3^49999 //N  =>  -3.85 * 10^23855          okay
> -3^49999.      =>  -3.85 * 10^23855          okay
> (-3)^49999.    =>  -3.85 * 10^23855 + 4.56*10^23844 i       wrong
> (-3)^49999     =>  -3.85 * 10^23855          okay
> 
> Is this a known problem?
> Is there a work around ?
> Obviously this is part of a more complicated calculation and so I
> cannot simply leave out the brackets.
> 
>  Many thanks,
> 
>                 Axel


It is known behavior. I would not regard it as a problem insofar as it 
is also expected behavior (that is, not a bug).

Raising a number to a power in approximate arithmetic will be done more 
or less as follows.

(1) Find the (approximate) log of the base. Call this logb.
(2) Compute the exponential of logb*power.

Given that you use N without requesting specific precision, these 
computations will be performed using machine arithmetic if possible. 
Otherwise they will sue bignum (software) arithmetic but at 
$MachinePrecision. That is what happens in this case due to the sizes of 
exponents required.

We can do this "by hand" as below.

In[18]:= InputForm[lb = Log[-3.]]
Out[18]//InputForm= 1.0986122886681098 + 3.141592653589793*I

In[20]:= InputForm[Exp[lb*49999]]
Out[20]//InputForm=
-3.8513654349963041533518106689182`15.954589770191005*^23855 +
  4.5651915515655449441209549063423`15.954589770191005*^23844*I

The factor of 49999 has the effect of amplifying error in that exponent 
by about 5 orders of magnitude. As machine precision handles about 16 
decimal places, we see that a result good to only 11 or so places is a 
quite plausible outcome. Notice (e.g. by comparison with N[3^49999,50]) 
that the real part of the above is only "correct" to 11 places. As the 
imaginary part is about 11 orders of magnitude smaller than the real 
part, it's contribution to the relative error is also in line with 
expectations.

If you want higher precision results your options are to request higher 
precision (the hammer approach) or to try to rearrange the computations 
in such a way as to reduce effects of truncation and other error when 
doing approximate numerical evaluations. A beneficial effect of using 
higher precision is that significance arithmetic will be utilized, and 
this will let you know that some "digits" are not to be trusted. For 
example, below we learn that the imaginary part has NO significant 
digits, and is at least 19 orders of magnitude smaller than the real part.

In[23]:= Exp[N[lb*49999,25]]
                                   23855        23836
Out[23]= -3.8513654349686329705 10      + 0. 10      I


Daniel Lichtblau
Wolfram Research





  • Prev by Date: Re: Compile&Which
  • Next by Date: Re: Bug in calculating -3^49999.0
  • Previous by thread: Re: Bug in calculating -3^49999.0
  • Next by thread: Re: Bug in calculating -3^49999.0