There are multiple ways to convert an expression to machine precision, for example:
In[1]:= a = Sqrt[2]
Out[1]= Sqrt[2]
In[2]:= {1.a, 1`a, N@a, SetPrecision[a,MachinePrecision]}
Out[2]= {1.41421,1.41421,1.41421,1.41421}
In[3]:= Precision /@ %
Out[3]= {MachinePrecision,MachinePrecision,MachinePrecision,MachinePrecision}
My question is whether or not these methods are absolutely equivalent. Is it just a matter of personal taste which one to use, or are there examples where they behave differently?
Answer
In terms of speed N and SetPrecision can be expected to be faster as they do not involve an unnecessary multiplication. (Conversely 2` * a would be better than N[2 * a] because the latter does exact multiplication before the conversion.)
1. a and 1` a can be considered identical because they represent the same input. Personally I have taken to using the latter form for entering machine-precision integers because the syntax better reminds me of the purpose.
One can see that N and SetPrecision[#, MachinePrecision] & are, if not equivalent, closely related. Observe:
N[thing] := 17.5
NValues[thing]
{HoldPattern[N[thing, {MachinePrecision, MachinePrecision}]] :> 17.5}
Now:
N[thing]
SetPrecision[thing, MachinePrecision]
17.5
17.5
The fact that NValues output is given from SetPrecision indicates to me that it is using a common mechanism.
On-the-fly conversion does not use NValues:
1. thing
2` + thing
1. thing
2. + thing
Here is another demonstrable difference between N/SetPrecision and multiplication by 1.:
N[ Exp[1000] ] // Precision
SetPrecision[Exp[1000], MachinePrecision] // Precision
1. Exp[1000] // Precision
12.9546
12.9546
15.9546
Comments
Post a Comment