【问题标题】:How does C store a double into an allocated array of type float?C如何将双精度存储到浮点类型的分配数组中?
【发布时间】:2013-03-26 06:09:13
【问题描述】:

我正在将我的程序从浮点精度更改为双精度。 尽管如此,我还是通过从二进制文件中读取浮点数来开始这个例程。

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 的大小是 double,l 是 int,matlabfile 是文件指针)

我的问题:当运算以双精度完成时,C 如何处理浮点类型的输入参数,以及如何在输出中舍入结果? 是如图所示那么简单还是我错过了什么?

编辑: 文件 *vel, *matlabfile;

 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);

【问题讨论】:

  • 您需要向我们展示您的变量声明,即所有内容的类型。
  • 除了相关代码之外,您已经向我们展示了所有内容!以单精度数据开头的双精度计算代码在哪里?
  • 顾名思义,双精度数据类型的精度是浮点数的 2 倍。因此,从浮点数转换为双精度数不会损失精度(额外精度的位置可以用 0 填充)。截断发生在反向转换中。
  • 精度对算术很重要,因为我的算法可能会由于舍入误差而出现不稳定。输出只是质量证明。

标签: c floating-point precision double-precision


【解决方案1】:

它没有。它(隐式)将 double 转换为 float 并且您会失去精度。它基本上切断了最低有效位。

抱歉,没有具体的例子,但9.223372036854775808 之类的内容将变为9.223372037

当您将floats 加载到doubles 时,也会发生类似的情况。它将它们转换为不同的格式。 编辑...效果很好。

【讨论】:

  • "如果你把它作为一个浮点数转换回来,它不能保证和你之前的数字一样" - 你确定吗?
  • C 中没有“隐式转换”之类的东西。转换是一种显式转换。 “它(隐式)converts ...”会更正确。
  • 低位被四舍五入(在大多数实现中的默认模式下),而不是被截断。
  • @iheanyi:您的术语是错误的(或至少与语言标准使用的术语不一致)。 unsigned int x = 5; int y = x; -- 这是一个隐含的转换int z = (int)x); -- 这是一个 cast,它是一个显式转换。强制转换是一个运算符,由括号中的类型名称组成;它指定了显式转换。转换发生在源代码中。转换发生在运行时(如果编译器能够对其进行优化,也可能在编译时发生)。
  • @KeithThompson 感谢您的回复。我撤回我的更正。
猜你喜欢
  • 1970-01-01
  • 2014-12-09
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
相关资源
最近更新 更多