C++ 检查传递的双参数是否为";“足够接近”;被认为是完整的

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

我正在编写一段代码,需要检查某个可以接受双精度值的变量是否实际接受了整数值。我认为如果双变量在整数的容差内,则取一个整数值。该公差为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 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适用于我的情况,适合我当前的代码。