sscanf的精确问题

时间:2013-05-30 08:45:12

标签: c++ floating-point scanf

我正在使用sscanf从文本文件中读取一些值,并使用%lf将它们存储为double。

但价值正在变得圆滑。例如

阅读内容:5.655035220-E02 存储的内容:0.0565504

我认为它与格式说明符“%lf”有关。

请建议正确的格式说明符,以便读取和存储值。

4 个答案:

答案 0 :(得分:3)

你的意思是你已经编写了这样的代码(感谢下次提供你的代码,顺便说一下,它确实有助于理解正在发生的事情而不是依赖模糊的线索):

#include <stdio.h>

int main(){
  double v2;
  sscanf("5.655035220e-02", "%lf", &v2);
  printf("%f\n", v2);
  return 0;
}

您获得的结果如下:

0.056550

(给或取十进制数字。)

问题不在sscanf()的十进制到双转换中,这很好,但在printf()的双倍到十进制转换中。变量v2包含您扫描的数字的良好近似值。您只是不要求printf()打印此近似值的多个数字。尝试:

printf("%.10f\n", v2);
0.0565503522

答案 1 :(得分:1)

看一下这段代码,

double tt=  5.655035220e-02;
printf("%le",tt);
getchar();

答案 2 :(得分:1)

你有2个问题

你的printf()说明符正在四舍五入 (可能)您的浮点变量无法保留所有所需的精度。

建议的格式说明符:
阅读:sscanf(buffer, "%le", &d)
存储:printf("%.*le", DECIMAL_DIG /* or DBL_DIG+3 */, d)


问题1

double d;
sscanf("5.655035220e-02", "%lf", &d);
printf("%.7lf\n", d);  // 0.0565504
printf("%.7le\n", d);  // 5.6550352e-02
printf("%.9le\n", d);  // 5.655035220e-02

如果您使用%e打印出来,它们将是更重要的数字而不是%f,其前导零位数。您看到的数字是舍入值。 存储的数字为5.65503522000000008 ... e-02


问题2

如果使用类型float而不是double,则在典型的4字节浮点中,5.655035220e-025.65503537...e-02时,您可能会遇到精度损失。


推荐@devnull关于阅读每个计算机科学家应该知道的关于浮点运算的想法http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

答案 3 :(得分:0)

解决方案与IAM HERE的帖子相同。问题是您将值写为5.6 ... 20-e02但它应该是5.6 ... 20e-02(注意, - 在E之后,而不是之前!)。