Re: Accuracy and Precision
- To: mathgroup at christensen.cybernetics.net
- Subject: [mg769] Re: Accuracy and Precision
- From: rknapp (Robert Knapp)
- Date: Tue, 18 Apr 1995 01:03:14 -0400
- Organization: The Santa Fe Institute
In article <3mf8nk$l4o at news0.cybernetics.net> Paul E Howland <PEHOWLAND at taz.dra.hmg.gb> writes: > > I'm struggling to get my head around the difference between Accuracy[] > and Precision[], and similarly AccuracyGoal[] and PrecisionGoal[]. I'm > writing a small optimisation package at the moment, and would like my > options to be similar to those of FindMinimum[], but can't sort out the > difference. > > I get the same answer for Accuracy[1] as Precision[1], and > for Accuracy[1.] as Precision[1.], and for > Accuracy[1.000000000000000000000000000000000001] as > Precision[1.000000000000000000000000000000000001]. > > I'm afraid the accuracy of my brain is unable to cope. > However, I am sure the scale of your brain is quite able to cope. Introduction of the term scale makes the concept of accuracy and precision easier to grasp because it can then be expressed as an equation. precision = scale + accuracy where scale(number) can be defined (roughly (due to roundoff of accuracy and precision)) as Log[10,Abs[number]]. Note that is is possible for any of these quantities to be negative (though in general zero is taken to be a lower bound for precision because numbers with negative precision are generally not particularily useful.) Thus in your example since the scale is 0, the precision and accuracy should be identical. Here are a few examples to further illustrate the idea. In[1]:=sap[number_] := {Log[10,Abs[number]],Accuracy[number],Precision[number]} In[2]:=sap[.1] Out[2]={-1., 17, 16} In[3]:=sap[10.] Out[3]={1, 15, 16} In[4]:=sap[N[E^10,30]] Out[4]={4.3429448190325182765112891892, 24, 29} In[5]:=sap[$MinMachineNumber] Out[5]={-307.954, 324, 16} Now as to AccuracyGoal and PrecisionGoal. It is proabably easiest to think of them separately. AccuracyGoal is the number of digits of accuracy to seek (independent of the precision). Thus, whatever the scale of your answer, AccuracyGoal is like an absolute error tolerance. In fact, when the AccuracyGoal is met, error <= 10^(-AccuracyGoal) Thus, when using the default (6 on most machines with 16 digit floating point numbers), you are shooting for an absolute tolerance of 10^-6. PrecisionGoal is the number of precise digits in the result independent of scale. This is a relative error tolerance. When the precision goal is met, one can generally say error <= scale(answer) 10^(-PrecisionGoal) Thus, when using the default, you are shooting for your answer to have 6 meaningful digits. When both are present, the error estimate looks something like this error <= 10^(-AccuracyGoal) + scale(answer)*10^(-PrecisionGoal) Thus an Accuracy or Precision goal of Infinity means you are using exculsively the other one. Note that AccuracyGoal and PrecisionGoal say nothing about the precision and accuracy of the number returned--in general for calculations done with the default WorkingPrecision = $MachinePrecision, the precision of the numbers will be equal to $MachinePrecision. Some examples: In[6]:=NIntegrate[Exp[x],{x,0,1},AccuracyGoal->6,PrecisionGoal->Infinity] Out[6]=1.71828 No sweat getting the answer to absolute tolerance 10^-6 In[7]:=NIntegrate[10.^20 Exp[x],{x,0,1},AccuracyGoal->6,PrecisionGoal->Infinity] NIntegrate::ploss: Numerical integration stopping due to loss of precision. Achieved neither the requested PrecisionGoal nor AccuracyGoal; suspect one of the following: highly oscillatory integrand or the true value of the integral is 0. Out[7]= 20 1.71828 10 There is no chance it will get the answer to absolute tolerance of 10^-6 with only 16 digits to work with!! In[8]:=NIntegrate[10.^20 Exp[x],{x,0,1},AccuracyGoal->Infinity,PrecisionGoal->6] Out[8]= 20 1.71828 10 However, it has no problem getting 6 digits of precision. Rob Knapp WRI