如何以人类可读的形式将双精度写到文件并读回确切的双精度?

问题描述 投票:2回答:2

是否有可能以人类可读的形式将任意双精度数写入文件并得到精确地,当读回时,所有64位都是相同的双精度数吗?

当然,这可以通过将double写入二进制数据来实现,例如:

static void writedouble(FILE *fp, double d) {
    fwrite(&d, sizeof(double), 1, fp);
}

但是那不是我想要的。我希望double以易于阅读的形式编写,例如像这样:

static void writedouble(FILE *fp, double d) {
    fprintf(fp, "%.14g", d);
}

然后再读一遍,就像这样:

static void readdouble(FILE *fp, double *d) {
    fscanf(fp, "%.14g", d);
}

[之后,我想测试两个double是否相同,例如:

printf("Check: %d\n", memcmp(&in_double, &out_double, sizeof(double));

将其存储为二进制数据时,是完全可能还是只能得到精确的double

c floating-point double
2个回答
2
投票

是否有可能以人类可读的形式向文件写入任意双精度数,并在读回时获得所有64位相同的双精度数?

是的,当然可以,只要您使用足够的精度。 double的精度为[[至多 16个十进制数字,因此以下程序可以正常工作:

#include <stdio.h> #include <assert.h> #include <string.h> #include <math.h> static void writedouble(FILE *fp, double d) { fprintf(fp, "%.16g", d); } static void readdouble(FILE *fp, double *d) { fscanf(fp, "%lg", d); } int main(void) { FILE *fp = fopen("test.txt", "w+"); double x = M_PI; // Use pi, just as a test. double y; writedouble(fp, x); rewind(fp); readdouble(fp, &y); fclose(fp); // Check if the actual representation of the two values // in memory is exactly the same. assert(memcmp(&x, &y, sizeof(double)) == 0); return 0; }
上面的代码和您的代码之间的主要区别是:

    printf的调用精度为16,而不是14
  1. scanf的调用没有精度修饰符(因为不需要或不支持它),但是具有l修饰符,因为(与printf不同)scanf区分floatfeg)和doublelflelg)。

0
投票
[另一种可能性是%aprintfscanf格式。它是文本,并且100%可逆,尽管它在人类可读性部门中有些受损。
© www.soinside.com 2019 - 2024. All rights reserved.