Re: Possible bug in Floor function?

*To*: mathgroup at smc.vnet.net*Subject*: [mg132355] Re: Possible bug in Floor function?*From*: Itai Seggev <itais at wolfram.com>*Date*: Wed, 19 Feb 2014 02:00:51 -0500 (EST)*Delivered-to*: l-mathgroup@mail-archive0.wolfram.com*Delivered-to*: l-mathgroup@wolfram.com*Delivered-to*: mathgroup-outx@smc.vnet.net*Delivered-to*: mathgroup-newsendx@smc.vnet.net*References*: <20140215090214.8888569D4@smc.vnet.net>

On Sat, Feb 15, 2014 at 04:02:14AM -0500, psycho_dad wrote: > Hi, > > I think I may have stumbled upon a possible bug in Floor. Evaluating the following gives the correct result: > > Floor[Log[10, 100.]] > 2 > > Evaluating it with a replacement and //N gives a message and the wrong result: > > Floor[Log[10, x]] /. x -> 100 // N > > Floor::meprec: Internal precision limit $MaxExtraPrecision = 50.` reached while evaluating Floor[Log[100]/Log[10]]. >> > > 1 > > I'm on Math 9.0 + Win7, but Math 8 gives the same (wrong) result as well. It's not a bug per se, but it is a somewhat unfortunate edge case. No one has really hit on the fundamental issue, so here it is: In[37]:= Log[10, 100] Out[37]= 2 In[38]:= Log[10, x] Out[38]= Log[x]/Log[10] Doing things symbollically has introduced an extra division. This will come up when trying to evaluate things numerically. If you introduce an arbitary precision x, it will compute to whatever precision x is, round to 2 (of some precision), and give you that answer: In[40]:= Floor[Log[x]/Log[10]] /. x -> 100`50 Out[40]= 2 If you give it a machine precision, it will perform the computation without error checking, get a number slightly less than 2 due to rounding, and return 1: In[39]:= Floor[Log[x]/Log[10]] /. x -> 100. Out[39]= 1 When you substitue in 100, it attempts to calculate the answer to arbitrary precision, reaches $MaxExtraPrecision, issues the message, and then returns unevaluated: In[41]:= Floor[Log[x]/Log[10]] During evaluation of In[43]:= Floor::meprec: Internal precision limit $MaxExtraPrecision = 50.` reached while evaluating Floor[Log[100]/Log[10]]. >> Out[41]= Floor[Log[100]/Log[10]] When you then hit it with N, you get back to the In[39] case, and end up with 1. One way to prevent this sort of premature evaluation which can lead to confusing results is to use Block to temporarily reset variables at the beginning of a computation, rather than substituting the values in at the end. (Notice there's no mprec message, since we went streight to Log[10,100].) In[44]:= Block[{x = 100}, Floor[Log[10, x]]] Out[44]= 2 -- Itai Seggev Mathematica Algorithms R&D 217-398-0700

**References**:**Possible bug in Floor function?***From:*psycho_dad <s.nesseris@gmail.com>