C++ 检查传递的双参数是否为";“足够接近”;被认为是完整的
我正在编写一段代码,需要检查某个可以接受双精度值的变量是否实际接受了整数值。我认为如果双变量在整数的容差内,则取一个整数值。该公差为1e-5 以下是我的代码:C++ 检查传递的双参数是否为";“足够接近”;被认为是完整的,c++,rounding-error,C++,Rounding Error,我正在编写一段代码,需要检查某个可以接受双精度值的变量是否实际接受了整数值。我认为如果双变量在整数的容差内,则取一个整数值。该公差为1e-5 以下是我的代码: #define SMALL 1e-5 //Double that attains this is considered non zero. Strictly Less than this is 0 int check_if_integer(double arg){ //returns 1 if arg is close enough t
#define SMALL 1e-5
//Double that attains this is considered non zero. Strictly Less than this is 0
int check_if_integer(double arg){
//returns 1 if arg is close enough to an integer
//returns 0 otherwise
if(arg - (int)arg >= SMALL){
if(arg + SMALL > (int)(arg+1.0)){
return(1);
//Code should have reached this point since
//arg + SMALL is 16.00001
//while (int)(arg+1.0) should be 16
//But the code seems to evaluate (int)(arg+1.0) to be 17
}
}
else{
return(1);
}
return(0);
}
int main(void){
int a = check_if_integer(15.999999999999998);
}
不幸的是,在传递参数15.99999999998时,函数返回0。也就是说,它认为参数是分数的,而它应该返回1,表示参数“足够接近”16
我正在使用VS2010专业版
任何指点都将不胜感激 是的,浮点很难。仅仅因为
15.999999998<16.0
,这并不意味着15.99999999998+1.0<17.0
。假设您有一个精度为三位数的十进制浮点类型。在该类型的精度方面,9.99+1.0
会得到什么结果?数学结果将是10.99
,四舍五入到该类型的精度将得到11.0
。二进制浮点也有同样的问题
在这种特殊情况下,您可以将
(int)(arg+1.0)
更改为(int)arg+1
(int)arg是精确的,整数加法也是精确的。是的,浮点很难。仅仅因为15.999999998<16.0
,这并不意味着15.99999999998+1.0<17.0
。假设您有一个精度为三位数的十进制浮点类型。在该类型的精度方面,9.99+1.0
会得到什么结果?数学结果将是10.99
,四舍五入到该类型的精度将得到11.0
。二进制浮点也有同样的问题
在这种特殊情况下,您可以将(int)(arg+1.0)
更改为(int)arg+1
(int)arg
是准确的,整数加法也是准确的。进一步了解hvd关于类型的回答;由于小双精度的内部表示方式,在大双精度上加/减小双精度也是不可取的
避免这两个问题的简单解决方法是:
if (abs(arg - round(arg)) <= SMALL) {
return (1);
} else {
return (0);
}
if(abs(arg-round(arg))进一步了解hvd关于类型的回答;由于小双精度的内部表示方式,也不建议在大双精度中添加/减去小双精度
避免这两个问题的简单解决方法是:
if (abs(arg - round(arg)) <= SMALL) {
return (1);
} else {
return (0);
}
if(abs(arg-round(arg))该轮在VS2010中似乎不可用。但我有一个在该链接中指定的解决方案。您的代码工作正常。谢谢。该轮在VS2010中似乎不可用。但我有一个在该链接中指定的解决方案。您的代码工作正常。谢谢。您的建议在我的情况下有效,并适合我的当前代码。您的suggestion适用于我的情况,适合我当前的代码。