Date: Dec 2, 2012 5:19 PM
Author: Jeff
Subject: How to import data without losing much precision

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.22464679914735320717376402945839660462569212467758e-16,-0.707106781186547461715008466853760182857513427734375,-1,-0.7071067811865476837596133918850682675838470458984375,0,0,0,0,0,0,0,0
-7.519528416073247371557097289336037138074431140921661e-05,0.2952479347203849559418391973464323996267921756953001,0.4173620664315570311651056728541320239855849649757147,0.2952479706713651090284420558385036770232545677572489,-7.524612652097207200814894090907733459339112869201927e-05,-0.2950974933097045235536482615801290307899762410670519,-0.4175125078422409145146015213567736168442934285849333,-0.2950975292606799753227907884278735650696035008877516,-7.307347221309693227484088353350377698092188438749872e-05,-0.4908319110134666044518731570223124549556814599782228,-0.6943176939679628171002076508777633989666355773806572,-0.4908316435424278546958368890651414062631374690681696,-7.345173337937191360150656260687845877654922333022114e-05,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.51952841607324750000e-005

EDU> data=textread('u1.csv.txt', '%f', 'delimiter', ',')
(doesn't import data as a matrix)
EDU> sprintf('%.20e', data(2,1))
ans =
7.07106781186547460000e-001

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.07106781186547460000e-001

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.07106781186547460000e-001

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 64-bit Windows 7 machine. I don't really know how much precision my version of Matlab has (or how to find out).