2013-03-25 130 views
0

我正在改變我的程序從浮點精度到雙精度。 不過,我通過從二進制文件中讀取浮點數來啓動此例程。C如何將double存儲到float類型的分配數組中?

bufz = alloc1float(nz); 
for (i=0; i<nx; i++) { 
    nu = efread(bufz,sizeof(float),nz,vel); 
    for (k=0; k<nz; k++) 
     vn2[k][i] = bufz[k]; 
} 

我繼續進行的計算方法,應爲雙精度和所計算的值寫入到一個文件:

matlabfile=fopen("matlabfile","a+"); 
fprintf(matlabfile,"%d;%15.7e;%15.7e\n",l,amxs,amxr); 
fclose(matlabfile); 

(AMXS和amxr是大小雙重的,l爲int和matlabfile是一個文件指針)

我的問題:C如何處理浮點類型的輸入參數,當以雙精度完成算術,以及它如何舍入輸出結果? 難道這樣容易嗎?或者我錯過了什麼?

編輯: 文件* vel,* matlab文件;

int main(int argc, char *argv[]) 
{ 

int i, nx, nz, k, nu, l; 
double amxs, amxr; 
double *buf; 
double **vn2; 

vn2 = alloc2double(nx,nz); 
buf = alloc1float(nz); 

    /* read input binary file */ 
    for (i=0; i<nx; i++) { 
    nu = efread(buf,sizeof(float),nz,vel); 
    for (k=0; k<nz; k++) vn2[k][i] = bufz[k]; 
    } 

Arithmetics with double precision arrays, variables and vn2... 

// save output 
matlabfile=fopen("matlabfile","a+"); 
fprintf(matlabfile,"%d;%15.7e;%15.7e\n",l,amxs,amxr); 
fclose(matlabfile); 
+1

你需要告訴我們你的變量聲明,即什麼類型的一切。 – 2013-03-25 21:22:24

+0

您向我們展示了除相關代碼以外的所有內容!以單精度數據開始的雙精度計算代碼在哪裏? – 2013-03-25 21:33:15

+0

顧名思義,與浮點數相比,double數據類型具有2x精度。因此,對於從浮點型轉換爲雙精度型,沒有精度損失(額外的精度位置可以用0填充)。截斷髮生在逆向轉換上。 – CuriousSid 2013-03-25 21:49:02

回答

1

它沒有。它(隱含地)將double轉換爲float,你失去了精度。它基本上剔除最不重要的位。

對不起,缺乏具體的例子,但像9.223372036854775808將變成9.223372037

當您將floats加載到doubles時,會發生類似的情況。它將它們轉換成不同的格式。 編輯 ...哪個工作得很好。

+1

「如果你將它作爲浮點數重新使用,它不能保證與之前的數字相同」 - 你確定嗎? – 2013-03-25 21:45:48

+0

[Not quite](http://stackoverflow.com/q/14773142/968261)。 – 2013-03-25 21:46:17

+0

感謝Philip的快速回復。它會自動將浮點數轉換爲雙精度還是必須在計算之前轉換我的輸入?我的意思是我首先將它們存儲在float類型的bufz數組中。 – MichaelScott 2013-03-25 21:47:25

相關問題