fscanf读取文件里的浮点数的问题!

tianqing52 2009-07-02 10:42:44
使用fscanf(fp,"%lg",&x);将文件fp里的十进制小数读取到double 类型数据x中。
我的文件的数据是:1.1254 -2.0988 ....后面有四个小数点的,可是为什么读取出来的时候变成了1.12549999999998
-2.0988000000002之类的了呢???fscanf中的"%lg"是什么类型的,我要如何才能成功读取我的数据呢?请高手指教。。。。我的分数没了,还请大家不要太在意加分,给我指点指点。。不甚感激。
...全文
1619 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
arong1234 2009-07-07
  • 打赏
  • 举报
回复
这根本不是更高精度的问题
在C、C++里时没有所谓的4位小数的问题的
计算机用二进制小数表示浮点数,是不可能准确表达几位十进制小数的
后面多几个小数位,误差只要在一定精度范围内,就应该是对的
0.1234
0.1233999999应该当作同一个数

[Quote=引用 5 楼 tanadar 的回复:]
如果双精度不够用的话,只有自己写高精度的浮点数据类型了:
《自己动手打造“超高精度浮点数类”》源代码简要导读
http://blog.csdn.net/housisong/archive/2007/12/24/1965652.aspx
[/Quote]
tianqing52 2009-07-07
  • 打赏
  • 举报
回复
好的谢谢....
Walf_ghoul 2009-07-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 arong1234 的回复:]
这根本不是更高精度的问题
在C、C++里时没有所谓的4位小数的问题的
计算机用二进制小数表示浮点数,是不可能准确表达几位十进制小数的
后面多几个小数位,误差只要在一定精度范围内,就应该是对的
0.1234
0.1233999999应该当作同一个数


引用 5 楼 tanadar 的回复:
如果双精度不够用的话,只有自己写高精度的浮点数据类型了:
《自己动手打造“超高精度浮点数类”》源代码简要导读
http://blog.csdn.net/h…
[/Quote]
嗯。。。
liao05050075 2009-07-02
  • 打赏
  • 举报
回复
要知道,浮点数在内存中的表示是不精确的。所以,出现了一点误差也是正常的。一般也不会有太大影响。
如果你一定要精确,那么你就不能浮点数来表示,只能采用高精度小数运算
tanadar 2009-07-02
  • 打赏
  • 举报
回复
#include <stdio.h>

main()
{
FILE *fp;
long double x;
fp = fopen("1.txt", "r");
fscanf(fp,"%Lf",&x);
printf("%Lf\n", x);
printf("%.4Lf\n", x);

fscanf(fp,"%Lf",&x);
printf("%lf\n", x);
printf("%.4Lf\n", x);
}

使用long double 类型提高精度,使用.4Lf格式输出规定精度。
tanadar 2009-07-02
  • 打赏
  • 举报
回复
如果双精度不够用的话,只有自己写高精度的浮点数据类型了:
《自己动手打造“超高精度浮点数类”》源代码简要导读
http://blog.csdn.net/housisong/archive/2007/12/24/1965652.aspx
tianqing52 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liao05050075 的回复:]
要知道,浮点数在内存中的表示是不精确的。所以,出现了一点误差也是正常的。一般也不会有太大影响。
如果你一定要精确,那么你就不能浮点数来表示,只能采用高精度小数运算
[/Quote]

我计算的这些数据都是语音参数的MFCC特征参数,用来计算,对结果影响很大。
您说采用高精度小数运算,怎么来实现呢,可以再讲详细些么?我还是不知道该怎么做。谢谢哈~~~~
tianqing52 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tanadar 的回复:]
C/C++ code#include <stdio.h>

main()
{
FILE *fp;
long double x;
fp = fopen("1.txt", "r");
fscanf(fp,"%Lf",&x);
printf("%Lf\n", x);
printf("%.4Lf\n", x);

fscanf(fp,"%Lf",&x);
printf("%lf\n", x);
printf("%.4Lf\n", x);
}


使用long double 类型提高精度,使用.4Lf格式输出规定精度。
[/Quote]

我用这些数据是来计算用的,不用来输出,这样不精确对计算结果影响很大。要怎么才能精确读取呢?

70,014

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧