C语言 fputs vs. fprintf和double

q1qsirdb  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(101)

我需要把一个double值放到一个文件中,所以对于我需要输出的其他字符串,我使用fputs,因为我认为fputs比fprintf快。
但是如果我想输出double值,我不能用fputs来做,所以我尝试了fprintf,这是非常慢的,如果我替换fprintf并在那里放一个fputs(“TEST”,file),我需要更多的时间;
我怎样才能像字符串一样快地输出double呢?需要先把它转换成字符串吗?
我发现了一些转换。但是如果我使用它们,我就像使用fprintf一样慢。
那么我怎样才能把双精度型输出到一个文件中呢,就像把一个字符串输出到文件中一样快呢?

fputs("TEST",fileout); //FAST
  fprintf(fileout, "%f",p); //SLOW

字符串
编辑:
使用fprintf double的时间:

END.PROCESSING.DATA: 2013-04-26 08:10:33.000
END.CALC.IN.FILE: 2013-04-26 08:11:13.000


使用fputs字符串的时间:

END.PROCESSING.DATA: 2013-04-26 08:14:10.000
END.CALC.IN.FILE: 2013-04-26 08:14:37.000


该时间的代码:

now = time (0);
strftime (buff, 100, "%Y-%m-%d %H:%M:%S.000", localtime (&now));
printf ("END.PROCESSING.DATA: %s\n", buff);

//output file
FILE *fileout;
fileout = fopen("out.txt","w");
double p;
for(i=0; i<17000;i++){
  for(j=0; j<i;j++){
    for(z=0;z<400;z++){
      //DO SOME WORK
    }
    p = 1.0;
    fputs(allsubsts[i],fileout);
    fputs(";",fileout);
    fputs(allsubsts[j],fileout);
    fputs(";",fileout);
    //fprintf(fileout, "%.21g", p);
    fputs("TEST",fileout);
    fputs(";\n",fileout);
  }
}
fclose(fileout);

now = time(0);
strftime(buff,100,"%Y-%m-%d %H:%M:%S.000", localtime(&now));
printf("END.CALC.IN.FILE: %s\n",buff);


时间之间的变化只是我在文件中放入双精度而不是TEST字符串的变化。

mnemlml8

mnemlml81#

将浮点数转换为十进制表示是一个非常慢的操作,你可以尝试使用%a说明符而不是%f来将其存储为十六进制浮点数;这应该快得多,并且会安全地保留原始值,而不是差的近似值。如果你需要十进制,你应该使用%.21g或类似的,而不是%f,因为后者将失去大部分精度。
如果这些方法对您来说都不够快,那么您可能需要直接保存值的二进制表示。

p1iqtdky

p1iqtdky2#

在C中,你可以使用the ryu library来加速浮点输出,首先将数字格式化到一个缓冲区中,然后将其写出来。它不是the fastest method,但仍然比常见的printf实现好。

double n = 0.42;
char buf[32];
d2s_buffered(n, buf);
fputs(buf, file);

字符串
使用十六进制printf%a)也是一种选择,但结果可能不容易被人类解释。
如果你可以使用C++,同样可以用C17 std::to_char或C20 std::format实现,而不需要额外的依赖。这些方法不依赖于locale,通常使用更快的算法将二进制浮点转换为十进制表示。

相关问题