Re: floor problems
- To: mathgroup at smc.vnet.net
- Subject: [mg8140] Re: [mg8113] floor problems
- From: seanross at worldnet.att.net
- Date: Fri, 15 Aug 1997 23:41:51 -0400
- Sender: owner-wri-mathgroup at wolfram.com
Tom wrote: > > Hello Mathematica users. > > I had a very frustrating time trying to debug some work I was doing in > Mathematica. I finally pared it down to a problem with the Floor > function, and I have illustrated my concern below. I am using M 3.0 and > a Mac computer. Does anyone have any advice or could you tell me if I > am doing something wrong? > > Floor[(.7 67 10)] > > 469 > > Floor[(67 10 .7)] > > 468 > > Sincerely, > > Tom De Vries > -- > Vermilion Home Education Program > > Tom De Vries > > 11003 - 132 st. > Edmonton, AB > Canada > T5M 1E4 > > Phone: (403)451-5822 > Fax: (403)454-0173 > > email: tom.devries at schoolofhope.org > email: toad at planet.eon.net Your only "error" is in assuming that all numbers have infinite precision. Since .7*670=469 and you are using default precision numbers, which is 16 digits, then we can say that (.7+/-10^-16) *(10+/-10^-16)*(67+/-10^-16)=469+/-3*10^-16. To perform mixed integer and real multiplication, Mma must do some kind of conversion from integer to real. My guess is that in one formulation it does the integer multiply first, then converts to real and in the other it does two integer conversions to real and then multiplies and this makes one result ever so slightly less than 469. You can see all the digits by using FullForm. The whole point of this is that you use a function like Floor when you are absolutely sure that the part of the number you don't want will always be greater than an integer. If the number is supposed to be an integer, then round-off will give you unstable results. I recommend using Round in this case. You may want to consider a little error trapping routine to check if Abs[Round[x]-x] is less than 10^-15 to avoid this kind of error.