int型数字与double型的误差

richer1015 2012-07-03 10:22:13
据说这个double中存储1有可能不是1,而是0.99...什么的,那如何确定int的1减去double的1是应该等于零呢
...全文
225 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
richer1015 2012-07-06
  • 打赏
  • 举报
回复
感谢各位的参与,
nice_cxf 2012-07-04
  • 打赏
  • 举报
回复
浮点数比较问题总是被放大。。。。
如果是经过运算可能有误差的,用6楼的办法,其中ERR取值多少看你自己需要的精度
如果没经过运算,直接判断即可:
int i=1;
double j=1.0;
if (double(i)==j)
...

赵4老师 2012-07-04
  • 打赏
  • 举报
回复
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)
同理,用二进制小数也不能精确表示某些10进制小数。
AnYidan 2012-07-04
  • 打赏
  • 举报
回复
int i;
double d, ERR = 0.0001;

if (ERR > (i-d) || -ERR < (i-d)))
printf("相等\n");
zunceng 2012-07-03
  • 打赏
  • 举报
回复
看double 在IEEE的格式 1位符号16位阶码47位精度
要知道double的存储结构才知道为什么不能表示一些数 再次double可以表示1

只有float的代码double类似

float rf=(float)32.09;

ANLYSES_FLOAT:
int f;
memcpy(&f,&rf,4);
int tmp_fraction,tmp_exp,tmp_s;
tmp_fraction=(f&0x007fffff)|0x00800000; //尾数 (已加1)即(int)tmp_fraction=1.f*2^23
tmp_exp=(f&0x7f800000)>>23; //阶码
tmp_s=(f&0x80000000)>>31; //符号

float ret;
double e=pow(2.0,(double)(tmp_exp-127));
if(tmp_s==0)
ret=(float)(tmp_fraction*e/(1<<23));
else
ret=-(float)(tmp_fraction*e/(1<<23));

printf("%f\n",ret);
疯疯癫癫 2012-07-03
  • 打赏
  • 举报
回复
1楼方法可以
赵4老师 2012-07-03
  • 打赏
  • 举报
回复
计算得到的1.0可能不等于1.0。
比如sin90°
int i=1;
double d;
d=sin(3.14159265/2.0);
if (fabs((double)i-d)<DBL_EPSILON) ...
参考float.h中DBL_EPSILON的定义。
N0bug 2012-07-03
  • 打赏
  • 举报
回复

int i=1;
double j=1.0
if(i-(int)j==0)
printf("OK!\n")
hot123tea123 2012-07-03
  • 打赏
  • 举报
回复
用int类型的1减去double型的1.0,那首先是要把int转换成double吧

69,336

社区成员

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

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