找回密码
 注册
Simdroid-非首页
查看: 46|回复: 5

读取很多同类型数据时,如何避免大数把小数变为0?

[复制链接]
发表于 2013-6-3 14:46:07 | 显示全部楼层 |阅读模式 来自 辽宁大连
在利用matlab用fread命令从二进制文件中读取一组双精度数据时,经常遇到大数把小数变为零的情形,
例如有的数字为15940934431,但是有的数字可能是0.1、1等,这种情况下,若是一次读取多个字节,那么就会出现小的数值变为0的情形;
再例如有的数字为0.3000,但是有的数字为0.3E-30,那么小的数字就会被变为0。
请问有什么方法能避免上述情况?
 楼主| 发表于 2013-6-3 14:52:42 | 显示全部楼层 来自 辽宁大连
Simdroid开发平台
补:但是若是单独读取位数比较大的数字的字节,比方说下一个字节存储的是15940934431,那么我单独读取包含这个数字的字节(比如:k=fread(fid,1,'double')),那么就可以避免上述情况了。
针对以上情况:我的想法是利用if语句,遇到较多位数的数值时,一个一个读取(貌似这样的话,还是需要一句一句判定,计算速度也会降低),但是不知道怎样实现。
回复 不支持

使用道具 举报

发表于 2013-6-3 15:45:02 | 显示全部楼层 来自 北京
nibam11 发表于 2013-6-3 14:52
补:但是若是单独读取位数比较大的数字的字节,比方说下一个字节存储的是15940934431,那么我单独读取包含 ...

二进制文件应该不存在这种错误

  1. t=uint8(rand(4).*100);
  2. s=randn(4).*1e-50;
  3. fid = fopen('bintest', 'w');
  4. fwrite(fid, t, 'uint8');
  5. fwrite(fid, s, 'double');
  6. fclose(fid);

  7. fid = fopen('bintest');
  8. outt = fread(fid, [4,4], 'uint8');
  9. outs = fread(fid, [4,4], 'double');
  10. fclose(fid);

  11. all(s(:)==outs(:))
  12. ans =
  13.      1
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2013-6-3 16:04:53 | 显示全部楼层 来自 辽宁大连
liuyalong008 发表于 2013-6-3 15:45
二进制文件应该不存在这种错误

版主你好,我的意思是这样:一组数中既有大数,又有小数,然后读取,小数就会变成0。
t=[1 2 3 5 9 10 0.1 0.5 5E-50 5E50]
fid=fopen('bintest','w')
fwrite(fid,t,'double');
fclose(fid);
fid=fopen('bintest');
s=fread(fid,[1,10],'double')

点评

应该如liuyalong008版主所说,”显示“和实际存储的不是一回事儿,楼主要分清楚。  发表于 2013-6-3 17:09
回复 不支持

使用道具 举报

发表于 2013-6-3 16:52:02 | 显示全部楼层 来自 北京
nibam11 发表于 2013-6-3 16:04
版主你好,我的意思是这样:一组数中既有大数,又有小数,然后读取,小数就会变成0。
t=[1 2 3 5 9 10 0. ...

注意command window 显示的格式


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

 楼主| 发表于 2013-6-3 17:15:54 | 显示全部楼层 来自 辽宁大连
谢谢版主
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-9-30 08:36 , Processed in 0.052351 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表