0

我正在尝试使用以下格式读取 c 文件:

6.43706064058,4.15417249035
3.43706064058,1.15417249035
...

我能够解析出两个双打,但是当我打印出我解析的内容时,我注意到我最多只能得到 6 个小数位。这是我的代码:

long double d1;
long double d2;
fscanf(file, "%Lf,%Lf", &d1, &d2);
printf("x:%Lf, y:%Lf", d1, d2);

输出:

x:6.437061, y:4.154172
...

我在哪里失去了精度?是否有可能正确读取它,但我的 printf 语句没有显示所有的精度?

4

3 回答 3

4

是否有可能正确读取它,但我的 printf 语句没有显示所有的精度?

这正是正在发生的事情。从printf(3)手册页

...小数点字符后的位数等于精度规范。如果缺少精度,则将其视为 6 ...

告诉printf通过更改格式字符串来显示更高的精度:

 printf("x:%.11Lf, y:%.11Lf", d1, d2);
于 2013-04-28T02:36:21.487 回答
2

默认%f格式仅在小数点后打印 6 位,这使您的精度比实际浮点值低得多(除非指数很大),并且可能根本没有精度(如果指数略为负数)。除非您知道所有值都远离零(例如,都大于 1),否则您确实需要使用%g格式(可以根据需要切换到指数表示法)或%e格式(始终使用指数表示法)来打印浮点数以保持其精度的方式进行值。

您还需要使用足够多的小数位。对于 IEEE 双精度,17 位小数就足够%.17g了,因此是首选格式。对于long double,这取决于您的特定实现中使用的类型。值得庆幸的是,C 提供了一个宏,DECIMAL_DIG它可以准确地为您提供所需的位置数量。所以你会使用:

printf("%.*Lg", DECIMAL_DIG, x);

或类似的。请注意,这将打印比您输入文件中最初存在的位置更多的位置。如果你知道你的输入总是有特定数量的地方,你可能只是硬编码而不是使用它DECIMAL_DIG来获得更统一的输出。

于 2013-04-28T02:53:37.153 回答
0

你没有达到你想要的精度的原因是因为数字中的间距水平不够。在第一个数字 6.43706064058 中,您有 13 个数字,包括小数点,所以您可以输入

    printf("x:%13Lf, y:%Lf", d1, d2);

x 允许 13 个空格:

对于第二个数字 4.15417249035,您也有 13 个,因此,您可以输入

    printf("x:%13Lf, y:13%Lf", d1, d2);

这将打印:

    x:6.43706064058, y:4.15417249035

执行 printf 函数时,必须为数字中的所有空格留出空间。希望有帮助!

于 2013-04-28T02:36:13.303 回答