h**********c 发帖数: 4120 | 1 如何处理这样的精度?
double r1 = 1.0*2.0 + 1.0*2.0 + 1.0 *2.0;
double r10 = r1/sqrt(1.0+1.0+1.0)/sqrt(2.0*2.0+2.0*2.0+2.0*2.0);
VC++ 2010 express, Vista 64 结果
r10 = 1.0000000000000002;
求acos(r10)的时候溢出,用float也一样戴一个尾巴。
这样的运算怎样避免溢出?
非express 版也有这个问题吗?
没有试别的compler. | w***n 发帖数: 1084 | | K****n 发帖数: 5970 | 3 Usually it's determined by computer bah, not the version of your IDE | h**********c 发帖数: 4120 | 4 刚看了个文章,有个概念叫guard bit或 digit,太长还没看完。
自己写了个函数,只能针对具体的问题。
谢谢回帖。
#define FLOATING_PRECISION 6
//#define FLOATING_TOLERANCE (1.0/pow(10.0,FLOATING_PRECISION))
#define FLOATING_TOLERANCE (1.0E-FLOATING_PRECISION)
template
bool isAlmost ( T l, T r= 0.0 ) {
if ( fabs(l-r) <= FLOATING_TOLERANCE)
return true;
else
return false;
} |
|