Re: Why Mathematica does not issue a warning when the calculations
- To: mathgroup at smc.vnet.net
- Subject: [mg117682] Re: Why Mathematica does not issue a warning when the calculations
- From: Richard Fateman <fateman at eecs.berkeley.edu>
- Date: Tue, 29 Mar 2011 06:59:46 -0500 (EST)
Anyway... .... > > (DL) Specifically if you take the symbolic input, evaluate exactly, > and then numericized, you get the situation I described. In detail: > > e1 = FractionalPart[(6 + Sqrt[2])^20]; > > Now evaluate in fixed precision. In Mathematica this can be done (to > close approximation) as below. > > In[28]:= a1 = Block[{$MinPrecision=10,$MaxPrecision=10}, > e1 /. n_Integer:>SetPrecision[n,10]] > Out[28]= 0.7149336997 > > In[29]:= a2 = Block[{$MinPrecision,$MaxPrecision}, > e1 /. n_Integer:>SetPrecision[n,20]] > Out[29]= 0.68777819382990998756 > > In[30]:= a1==a2 > Out[30]= False Yes, this is just fine. You are taking an expression e1 and applying two different functions, call them f10 and f20, and getting two different answers. There is no special reason to think that a1= f10(e1) and a2= f20(e1) should be the same, and they are in fact different. > > Recall that all we are doing, in effect, is numericizing the numbers > and evaluating in fixed precision. If this is not deemed to qualify as > the type of situation you describe no, because f10 and f20 are two different functions. This is not the situation I described, which is that a single function f when applied to e1 and e2 where e1==e2, should result in f(e1) - f(e2) == 0 > , then the more direct variant below will certainly suffice. > > In[36]:= b1 = With[{prec=10}, > Block[{$MinPrecision=prec,$MaxPrecision=prec}, > SetPrecision[-251942729309018542,prec] + (6 + Sqrt[2])^20]] > Out[36]= 0.6619679453 > > In[37]:= b2 = With[{prec}, > Block[{$MinPrecision=prec,$MaxPrecision=prec}, > SetPrecision[-251942729309018542,prec] + (6 + Sqrt[2])^20]] > Out[37]= 0.68777820337396297032 > > In[38]:= b1 == b2 > Out[38]= False > > This is truncation at work, behind the scenes. Again, these are two different functions, and there is no reason for them to result in the same answer. Fortran 77 has two (maybe more?) sine functions for different precisions. Starting with an exact integer 2, you presumably get different results for sin(1.0 * 2) and sin(1.0d0 * 2). The intrinsic functions for different precisions are different. Perhaps this is what you are getting at. If you call two different functions "the same" then it would seem that you might get different answers on inputs that are the same value (in Fortran or any other system). though the situation in Mathematica is kind of the reverse. That is, you have a function, say s[x_,y_]:=x-y. It is not really a single function of two arguments. Really it is a function of 4 arguments, s(x,y, Precision(x), Precision(y), and the result is computed by something like SetPrecision(RawSubtract(x,y),Min(prec1,prec2)) Calling a function like this requires you to distinguish x and y if they have different values or different precisions. Mathematica hides the precision of numbers from the user during ordinary arithmetic.