# Interpolation function precision in multi dimentional case

I have this interpolation example

zzz = Interpolation[{
{{1}, 2100*Pi},
{{2}, 3100*Pi},
{{3}, 4100*Pi}
}, InterpolationOrder -> 1];
zzz[2]
zzz[2.5]
zzz[2.5100]


and I am getting these resilts

9.424777960769379715387930149838508652591508198125317462924833776923449218858626995884104476026351204

10.9956

10.99557428756427633461925184147826009469009289781287037341230607307735742200173149519812188869740974


first number as expected with 100 digits, second with only 4 digits, but if I add 100 to the argument I can get it with 100 digits as well.

Now I use multidimensional example

testData = {
{{-2.*10^-6, 0, -18}, -1.00853429340956742965680093076966025423734590973983188199800080460508043197286933569747093680631648*10^6},
{{-2.*10^-6, 0, -17},
952504.61044236930112440429386078472672512393090882097358420180063200222870428099604804394164585046},
{{-2.*10^-6, 1, -18}, -1.008544941816832295575440188033483155333800668013690157106923425838109768669333223372232072904210136*10^6},
{{-2.*10^-6, 1, -17}, -952514.6672734985329986920711230513627204920640531655413765067694156739368659196153982113188871999717},

{{-1.78947*10^-6, 0, -18}, -1.00854109353837536345550608172429712197251598047769246281925070613484574642246277456744911673832572*10^6},
{{-1.78947*10^-6, 0, -17}, -952511.41057117723492310944481542159446029400164668155440545170216176754315387443491802212157785970},

{{-1.78947*10^-6, 1, -18}, -1.008551741385092646935524440345434727928230066236270646432464156954808417875408736480254883876917917*10^6},
{{-1.78947*10^-6, 1, -17}, -952521.4668417583449142805833940440259658101867440498419481296004930320450422321944211465035742782570}
};
ff[x1_, x2_, x3_] = Interpolation[testData, InterpolationOrder -> 1][x1, x2, x3]


and for this example, I cannot get the results with 100 digits, even if I use exact existing values

ff[-2.0100*10100^-6, 0.0100, -18.0100]
ff[-2.0100*10100^-6, 1.0100, -18.0100]

Out[350]= -1.00853*10^6
Out[351]= -1.00854*10^6


How to force interpolation to use required precision? There is no WorkingPrecision argument for interpolation.

UPDATE 1

even if I put 100 everywhere like this, it is still the same result

testData = {
{{-2100*10^-6, 0.0100, -18100}, -1.00853429340956742965680093076966025423734590973983188199800080460508043197286933569747093680631648100*10^6},
{{-2100*10^-6, 0.0100, -17100}, 952504.61044236930112440429386078472672512393090882097358420180063200222870428099604804394164585046100},

{{-2100*10^-6, 1100, -18100}, -1.008544941816832295575440188033483155333800668013690157106923425838109768669333223372232072904210136100*10^6},
{{-2100*10^-6, 1100, -17100}, -952514.6672734985329986920711230513627204920640531655413765067694156739368659196153982113188871999717100},

{{-1.78947100*10^-6, 0.0100, -18100}, -1.00854109353837536345550608172429712197251598047769246281925070613484574642246277456744911673832572100*10^6},
{{-1.78947100*10^-6, 0.100, -17100}, -952511.41057117723492310944481542159446029400164668155440545170216176754315387443491802212157785970100},

{{-1.78947100*10^-6, 1100, -18100}, -1.008551741385092646935524440345434727928230066236270646432464156954808417875408736480254883876917917100*10^6},
{{-1.78947100*10^-6, 1100, -17100}, -952521.4668417583449142805833940440259658101867440498419481296004930320450422321944211465035742782570100}
};
ff[x1_, x2_, x3_] =
Interpolation[testData, InterpolationOrder -> 1][x1, x2, x3]

• You have machine precision numbers in data. I would expect the output to always be machine precision. – Michael E2 Feb 11 '18 at 23:29
• I thought if I have a number like this -1.0085342934095674296568009307696602542373459097398318819980008 (with 100 digits after dot) it is not machine precision anymore. – Zlelik Feb 13 '18 at 19:06
• I put 100 explicitly everywhere (in UPDATE 1) and the result is the same. – Zlelik Feb 13 '18 at 19:21

Evaluate 0.0100 and you'll get a machine precision zero. Use the exact 0 instead:

fff = Interpolation[testData /. x_ /; x == 0 -> 0, InterpolationOrder -> 1];

fff[-2.100.*^-6, 0, -18.100.]
(*
-1.0085342934095674296568009307696602542373459097398318819980008046050\
804319728693356974709368063165*10^6
*)

• It works, thank you, but looks like a bug. how can I remember all these tricks :) Also if I do like this ff[-2.0100*10100^-6, 0, -18.0] it does not work, but if I do like that ff[-2.0100*10100^-6, 0, -18.0100] it works. What is the difference between 0 and -18.0? And what will happen, if I want to make a graph (Plot) of this function? Will it be full precision or again only machine precision? – Zlelik Feb 13 '18 at 22:16
• @Zlelik Don't you mean the difference between the machine precision -18.0 and the 100-digit precision -18.0100? Somewhere in the docs I think there's an explanation that zero cannot have a precision other than Infinity (i.e. exact) or MachinePrecision; it can have an Accuracy, though. The reason is that the precision of x is defined to be the uncertainty divided by x, and you cannot divide by x. – Michael E2 Feb 13 '18 at 22:20
• Thank you for clarifying. But why result is different for ff[-2.0100*10100^-6, 0, -18.0] and ff[-2.0100*10100^-6, 0, -18.0100]? – Zlelik Feb 15 '18 at 10:05
• @Zlelik According to the tutorial Machine-Precision Numbers, when you give machine-precision input to most expressions, including InterpolatingFunction, you get machine-precision output, no matter the precision of other parts of the expression. – Michael E2 Feb 15 '18 at 12:00
• I see. thank you for the link. What can I do to force Plot function to use full precision, but not machine precision? if I just do Plot[ff[-2.0100*10100^-6, 0, x], {x,-18,18}] it will use machine precision and I will get wrong graph. Will it work properly if I do like this Plot[ff[-2.0100*10100^-6, 0, x], {x,-18100,18100}]`? – Zlelik Feb 16 '18 at 13:42