# Converting to machine precision

There are multiple ways to convert an expression to machine precision, for example:

In:= a = Sqrt
Out= Sqrt

In:= {1.a, 1a, N@a, SetPrecision[a,MachinePrecision]}
Out= {1.41421,1.41421,1.41421,1.41421}

In:= Precision /@ %
Out= {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?

• You can also use DeveloperToPackedArray[{1, Sqrt, 3, 4}, Real] to create machine precision numbers.
– user21
Jun 28, 2012 at 17:35

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 ]                            // Precision

SetPrecision[Exp, MachinePrecision] // Precision

1. Exp                              // Precision

12.9546

12.9546

15.9546

• N also does some caching or am I mistaken? Jun 28, 2012 at 11:10
• @Ajasja I don't know, but I'll see what I can find. Jun 28, 2012 at 11:18
• Here is the relevant example reference.wolfram.com/mathematica/ref/ClearSystemCache.html Jun 28, 2012 at 12:34
• @Ajasja that kind of caching is not specific to N. Try: 11000000 Pi; // Timing twice. Jun 28, 2012 at 12:52
• @Mr.Wizard, thanks. I like the idea of using the backtick form as a reminder of the purpose. I think it looks a bit neater than 1. too (I always want to add a zero after the decimal point even though I know it isn't necessary) Jul 1, 2012 at 21:29