首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

int型数目字与double型的误差

2012-07-29 
int型数字与double型的误差据说这个double中存储1有可能不是1,而是0.99...什么的,那如何确定int的1减去dou

int型数字与double型的误差
据说这个double中存储1有可能不是1,而是0.99...什么的,那如何确定int的1减去double的1是应该等于零呢

[解决办法]
计算得到的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的定义。
[解决办法]
1楼方法可以
[解决办法]
看double 在IEEE的格式 1位符号16位阶码47位精度
要知道double的存储结构才知道为什么不能表示一些数 再次double可以表示1

只有float的代码double类似

C/C++ code
    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);
[解决办法]
int i;
double d, ERR = 0.0001;

if (ERR > (i-d) || -ERR < (i-d)))
printf("相等\n");
[解决办法]
浮点数比较问题总是被放大。。。。
如果是经过运算可能有误差的,用6楼的办法,其中ERR取值多少看你自己需要的精度
如果没经过运算,直接判断即可:
int i=1;
double j=1.0;
if (double(i)==j)
...

热点排行