# Global precision setting

Coming from Maple I do not understand how the precision for numerical computations in Mathematica is specified. I understand that there are various options to commands such as WorkingPrecision and PrecisionGoal. But I would like to use the same precision (above machine precision) for a number of computations including matrix operations and the FindRoot command outside and inside of routines. Also I would like to specify the precision of the output.

-
You can look at the documentation for the functions listed when you evaluate ?$*Precision. You can do fixed precision calculations with Block[{$MaxPrecision=..., $MinPrecision=...}, ...] or set these globally to affect all functions that rely on it – R. M. Jun 4 '12 at 19:50 I tried setting$MinPrecision=20 already. Strangely I still get results with ScientificForm[%, 20] with just 16 digits. Do matrix computations and FindRoot depend on it? – highsciguy Jun 4 '12 at 20:02
@highsciguy yes, but you have to be careful not to introduce machine-precision numbers at any point, which "poison" the result. That is, all numbers specified as decimals should have a precision annotation, e.g. 1.020. Also, you should be aware that some matrix decompositions are done in machine precision using LAPACK. – Oleksandr R. Jun 4 '12 at 20:12
I see. How do I tell mathematica that all numbers e.g. 1.5 are actually 20 Digits precision? SetPrecision on all numbers or add the 20 everywhere? – highsciguy Jun 4 '12 at 20:16
You can use either approach. SetPrecision will take the machine-precision value and extend it with base-2 zeros up to the required precision, which may not be what you want (since zeros in base 2 are not necessarily so in base 10; e.g. SetPrecision[1.9, 20] gives a result slightly less than 1.9). If you use the annotation, the zeros are taken to be in base 10 instead. Another possible approach is to use Rationalize. – Oleksandr R. Jun 4 '12 at 21:53

How do I tell mathematica that all numbers e.g. 1.5 are actually 20 Digits precision? SetPrecision on all numbers or add the 20 everywhere?

You could force this with $PreRead. This naive definition is likely inefficient and probably breaks a number of corner cases I have not considered, but here is a rough demonstration: $PreRead = (# /.
s_String /;
StringMatchQ[s, NumberString] &&
Precision@ToExpression@s == MachinePrecision :> s <> "20." &);

3/1.5 + Pi/7

Precision[%]

2.4487989505128276055

20.0879


As Alexey notes this breaks if the machine number string already has a "NumberMark" after it e.g. 1.23. One could use a more precise string replacement to avoid this.

A different approach is to process at the expression rather than box level, though this simple first attempt probably fails in some cases as well:

$Pre = Function[Null, Unevaluated[#] /. r_Real?MachineNumberQ :> RuleCondition@SetPrecision[r, 25], HoldAllComplete]  Now: MachineNumberQ[2.2] ToString[3.14]  False "3.140000000000000124344979"  - Your solution fails when the number entered has the NumberMark after digits, for example 1.5 . – Alexey Popkov Dec 1 '13 at 19:24 @Alexey I never thought it would be robust as written. Let me see if I can improve it some. – Mr.Wizard Dec 1 '13 at 20:42 Your second solution works in Mathematica 5.2 and 7.0.1 but not in v.8.0.4. Looks like a bug in $Pre in v.8.0.4. – Alexey Popkov Dec 1 '13 at 21:07

There is a quick-n-dirty solution. Set

$MinPrecision = 100  And then enter numbers something like x = 1.012;  You will be getting warnings as Precision::precsm: Requested precision 2. is smaller than$MinPrecision.
Using $MinPrecision instead.  but in this way you if you want to change precision you just change $MinPrecision value.

In[21]:= x

Out[21]= 1.\
0100000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000

-
I don't even get the Precision::precsm warning message. However it does not work on machine numbers; the entry form as you right noted is critical. +1 for a simple method that may work in a number of applications. – Mr.Wizard Feb 10 at 18:52