2013-03-25 126 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

相关问题