

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer

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?

share|improve this question
You can also use Developer`ToPackedArray[{1, Sqrt[2], 3, 4}, Real] to create machine precision numbers. – user21 Jun 28 '12 at 17:35
up vote 11 down vote accepted

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

{HoldPattern[N[thing, {MachinePrecision, MachinePrecision}]] :> 17.5}



SetPrecision[thing, MachinePrecision]


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


share|improve this answer
N also does some caching or am I mistaken? – Ajasja Jun 28 '12 at 11:10
@Ajasja I don't know, but I'll see what I can find. – Mr.Wizard Jun 28 '12 at 11:18
Here is the relevant example – Ajasja Jun 28 '12 at 12:34
@Ajasja that kind of caching is not specific to N. Try: 1`1000000 Pi; // Timing twice. – Mr.Wizard Jun 28 '12 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) – Simon Woods Jul 1 '12 at 21:29

Your Answer


