MathGroup Archive 2007

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

Search the Archive

Re: Floor doesn't compute in some cases

  • To: mathgroup at smc.vnet.net
  • Subject: [mg83379] Re: Floor doesn't compute in some cases
  • From: "David W.Cantrell" <DWCantrell at sigmaxi.net>
  • Date: Sun, 18 Nov 2007 04:59:32 -0500 (EST)
  • References: <fhjqkk$3gq$1@smc.vnet.net> <fhmgg0$9q1$1@smc.vnet.net>

Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com> wrote:
> Valeri Astanoff wrote:
>
> > Floor doesn't compute in some cases:
> >
> > Floor[Log[31]/Log[2]]
> >
> > 4
> >
> > ok, but:
> >
> > Floor[Log[32]/Log[2]]
> >
> > Floor::meprec: Internal precision limit $MaxExtraPrecision = 50.`
> > reached while evaluating Floor[Log[32]/Log[2]]. >>
> >
> > Floor[Log[32]/Log[2]]
> >
> > $Version
> >
> > 6.0 for Microsoft Windows (32-bit) (June 19, 2007)
> >
> > I don't see the reason why...
>
> Looking at In/Out[1], we can see that Log[32]/Log[2] is not simplified
> to 5, and that we need to use FullSimplify or N to get this value.
> Obviously Floor does not call either functions and uses arbitrary
> precision arithmetic to compute its result. (And arbitrary precision
> fails, this is the meaning of the error message.)
>
> In[1]:= {Identity[#], N[#], Simplify[#], FullSimplify[#], Floor[#]} &[
>   Log[32]/Log[2]]
>
> During evaluation of In[1]:= Floor::meprec: Internal precision limit \
> $MaxExtraPrecision = 50.` reached while evaluating \
> Floor[Log[32]/Log[2]]. >>
>
> Out[1]= {Log[32]/Log[2], 5., Log[32]/Log[2], 5,
>   Floor[Log[32]/Log[2]]}
>
> So to get the expected result, we must force the evaluation or
> simplification of the logarithms before calling Floor.

I suppose that's true. However, note that (at least in version 5.2) as an
alternative to your In[3] below, we may instead use FullSimplify _outside_
of Floor:

In[7]:= FullSimplify[Floor[Log[32]/Log[2]]]

Floor::meprec: Internal precision limit $MaxExtraPrecision = 50.`
reached while evaluating Floor[Log[32]/Log[2]].

Out[7]= 5

But I prefer Floor[FullSimplify[]] since it generates no warning.

> Note that even
> though N returns a machine-precision number, 5., the answer returned by
> Floor is still an exact (infinite-precision) number.
>
> In[2]:= Floor[N[Log[32]/Log[2]]]
>
> Out[2]= 5

As Bob H. already noted, using N in this way is perilous. I would suppose
that we could just a easily have gotten 4 as the result.

> In[3]:= Floor[FullSimplify[Log[32]/Log[2]]]
>
> Out[3]= 5

Another option is to use the fact that Log[x]/Log[2] is just the binary
logarithm of x:

In[6]:= Floor[Log[2, 32]]

Out[6]= 5

and so we get no warning message and there is no need to invoke Simplify.

David


  • Prev by Date: Re: memory release problem in mathematica6.0
  • Next by Date: Tally[ ] and Union[ ]
  • Previous by thread: Re: Floor doesn't compute in some cases
  • Next by thread: NDSolve and Differential Equations