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类似
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)
...