精度

2017-04-21 18 views
-2

を失うことなく、私は、データセット(CSV形式として記憶(12008 * 12008)マトリックス)を有するような浮動小数点数値を含む:私はそれを読んだとき、私は気づい精度

0.00000000000000000129097521168892,0.00000822381709160264,-0.0000202130952444797,-0.0000242966927641499,0.000030546233920949,0.0000371753288365733,-0.00000425477255333099,0.0000417806937053693,-0.0000108963812606789,-0.0000116825931954974,0.00000630880107874073,-0.0000148294201214316,0.000015379692507603,0.00000188679818192867,0.00000244261959932239,-0.00000000000000000151132910441927,-0.0000219241408193178,0.000017429377110585,0.00000870784208574737,0.0000364006097348257,0.0000113488247245831,0.000000061277075989572,0.00000139732542828701,0.000000106947553933263,0.0000326417023213338,0.000000461629854407632,0.0000154355086839126,-0.00000952557006126632,-0.00000661974638741755,0.0000100492673229086,-0.00000234761929597247,0.000000562031028984242,-0.0000111189586356939,0.0000147613296909272,-0.0000412808264307332,0.0000144980218289582,-0.00000396573532860471,0.00000284216015813941,-0.000000340292198448977,0.000000000000000000673559708847384,-0.000000000000000000477244282125147,0.0000295672329145256,0.000000265057585538249,-0.0000259880981140332,-0.000000655572300400449,0.0000275203484322834,0.00000939709816031401,-0.000000722013848489603,-0.000000131975990695569,-0.0000305715257167805,0.0000166359409438876,-0.0000108549024616569,0.0000035413589251256,0.0000134733827428785,0.00000033136969072632,-0.0000000227,0.0000251344669810146,0.00000507204772254958,-0.00000000193093573409854, 

0.0000000 
-0.000082 

私は私のプログラム内のバッファに精度を失うことなく、データセットから正確な値を読みたい:floatバッファーは、私は私のような何かを得るあまり精度を失います。私は読むために、次の小さなプログラムを使用しますが、私はそれが精度を失わないように、それを変更するかどうかはわからない:

float *data = malloc((12008 * 12008) * sizeof(float)); 
FILE *fp ; 
fp=fopen("./eig_matrix.csv","rb"); 
if(fp!= NULL) fread(data, (12008 * 12008)*sizeof(float),1,fp); 
fclose(fp); 
+2

これまで、あなたは妥当なものは何も読んでいません。あなたのCSVの文字は 'float'に変換されていますか? CSVを読むには、バイナリの読み取り以上のことが必要です。そして、 'malloc'や' fread'のようなプログラムの実行に関連するエラーを報告できる関数のrsultを常にチェックしてください。 – Olaf

+4

あなたのcsvファイルが本当にテキストファイルであるように聞こえます。 'fread'の呼び出しはテキストを浮動小数点に変換しません。 – bruceg

+0

基数10の数字列を 'float'に変換するコードはどこにありますか?あなたはそれが魔法によって起こることを期待していますか? –

答えて

1

floatタイプは浮動小数点データ型の少なくとも正確であるC.に彼らは、次のようranked次のとおりです。

  • float
  • double
  • long double

各タイプの長さ(バイト単位)は、特定のC実装によって異なります。理解しなければならない主な点は、各タイプに精度制限があり、より正確なタイプがより多くの領域を占めることです。より正確なデータ型を選択すると、目的に合ったものになる可能性があります。

2進数で10進精度を完全に取得することは不可能です。十進表記では、2進表記で無限に繰り返される数字(例えば、0.2)である正確な数字があり、印刷機能は一般に、特定の小数点以下の数字のみを表示する。これらの組み合わせは、数値が元の精度よりも小数点以下を使用して表示できることを意味します。

数値の小数精度を厳密に制御する必要がある場合(ある程度まで)、fixed-point notationを使用することができます。これは、通常、整数値を既知の(および固定の)スケーリング係数とともに含めることによって行われますが、スケーリング係数を考慮して算術演算を変更する必要があります。