Jeff
Posts:
113
Registered:
11/22/09


How to import data without losing much precision
Posted:
Dec 2, 2012 5:19 PM


I'm trying to import some data, which was created by C code, into Matlab without losing much precision. Can someone show me an example of how to do so?
I have about 52 decimal places of precision, with N=16 numbers on a line, like this:
u1.csv.txt:  0,0.707106781186547461715008466853760182857513427734375,1,0.7071067811865475727373109293694142252206802368164062,1.22464679914735320717376402945839660462569212467758e16,0.707106781186547461715008466853760182857513427734375,1,0.7071067811865476837596133918850682675838470458984375,0,0,0,0,0,0,0,0 7.519528416073247371557097289336037138074431140921661e05,0.2952479347203849559418391973464323996267921756953001,0.4173620664315570311651056728541320239855849649757147,0.2952479706713651090284420558385036770232545677572489,7.524612652097207200814894090907733459339112869201927e05,0.2950974933097045235536482615801290307899762410670519,0.4175125078422409145146015213567736168442934285849333,0.2950975292606799753227907884278735650696035008877516,7.307347221309693227484088353350377698092188438749872e05,0.4908319110134666044518731570223124549556814599782228,0.6943176939679628171002076508777633989666355773806572,0.4908316435424278546958368890651414062631374690681696,7.345173337937191360150656260687845877654922333022114e05,0.4909784362190551817528658823386322751503030303865671,0.6941711687623717434237127776874842766119400039315224,0.490978168748022819492613649794421348815376404672861 1 ...
I've tried using dlmread, csvread and importdata, but they cut off precision.
Now I am trying to use textread, because the format string specifier might let me keep precision. But I have not had any luck. I tried following example 4 in the documentation:
EDU> data=textread('u1.csv.txt', '%60.51f', 16, 'delimiter', ','); EDU> sprintf('%.20e', data(2,1)) ans = 7.51952841607324750000e005
EDU> data=textread('u1.csv.txt', '%f', 'delimiter', ',') (doesn't import data as a matrix) EDU> sprintf('%.20e', data(2,1)) ans = 7.07106781186547460000e001
EDU> data=textread('u1.csv.txt', '%f', 16, 'delimiter', ',') (reads only one line, but there's probably a way to read the "next" line) sprintf('%.20e', data(2,1)) ans = 7.07106781186547460000e001
I've tried other things, too, but I cannot get any more precision. You can see that their all losing precision after about 16 decimal places.
I have (and can create) other formats for the input file. Other formats that I have are u1.fixedWidth.txt and u1.tab.txt, which look like you'd expect them to look (u1.fixedWidth is printed with "%60.52f" and u1.tab.txt is printed as "%.52f\t"). But this also loses precision:
EDU>> data=textread('u1_0000000.fixedWidth.txt', '%60.52f', 16); EDU>> sprintf('%.20e', data(2,1)) ans = 7.07106781186547460000e001
Could someone show me an example of how to import my data with the most precision? Thanks you.
Note that I am using student version of Matlab R2009a (and cannot upgrade it) on a 64bit Windows 7 machine. I don't really know how much precision my version of Matlab has (or how to find out).

