EDIT: I filed a bug report and after a small back-and-forth the support person agreed this is a bug. He said: "I have filed a report with the developers to issue warning messages when the arithmetic can affect the results." I'm satisfied with that.
I noticed an odd mismatch between the behaviors of NDSolve and FindRoot.
If you give NDSolve an equation of a certain precision, say 20, and tell it to use a higher WorkingPrecision, say 30, it will complain (and rightly so), since it can't maintain a precision greater than it started with. For example:
NDSolve[{y'[x] == 2.0``20, y[0] == 0}, {y}, {x, 0, 1}, WorkingPrecision -> 30];
NDSolve::precw: The precision of the differential equation ({{(y^\[Prime])[x]==2.0000000000000000000,y[0]==0},{},{},{},{}})
is less than WorkingPrecision (30.`). >>
However, FindRoot seems to be more forgiving than it should be in a similar situation. For instance, if you have a function y[x] = 2x to precision 20...
Clear[y]
sol = NDSolve[{y'[x] == 2.0``21, y[0] == 0}, {y}, {x, 0, 1}, WorkingPrecision -> 21];
y[x_] = Evaluate[y[x] /. sol[[1]]];
Precision[y[1]]
20.699
...and you use it in FindRoot with WorkingPrecision->30...
root = FindRoot[y[x] == 1.0``30, {x, 0.4``20}, WorkingPrecision -> 30]
{x -> 0.500000000000000000000000000000}
...it doesn't complain at all! It even claims that it's able to keep a full precision of 30:
Precision[root]
30.
Which is seemingly does, despite having an equation less precise than that. It does complain if both sides of the given equation don't have high enough precision:
root = FindRoot[y[x] == 1.0``20, {x, 0.4``20}, WorkingPrecision -> 30]
FindRoot::precw: The precision of the argument function (InterpolatingFunction[{{0,1.00000000000000000000}},{5,3,1,{16},{4},0,0,0,0,Automatic,{},{},False},{{0,<<14>>,1.00000000000000000000}},{{0,2.00000000000000000000},{5.02973371873174322338*10^-6,2.00000000000000000000},<<12>>,{1.87545103551469488009,2.00000000000000000000},{2.00000000000000000000,2.00000000000000000000}},{Automatic}][x]==1.0000000000000000000)
is less than WorkingPrecision (30.`). >>
but I can't see why it would have a problem with the latter case but not the former.
FindRoot
makes its assessment based on the expression you supply before it begins evaluation. It doesn't know the precision ofy[x]
until after it supplies a numeric argument. $\endgroup$