比较双误差C ++

时间:2014-11-04 18:42:52

标签: c++ visual-c++ double

最近我在比较if语句中的double时遇到了问题。我试图以双倍的方式来计算整数的数量。作为初学者,我不确定我的代码出了什么问题。

这是我的代码:

#include <iostream>

using namespace std;

int main(){
int x=0;//convert double to int
long double Out;//Result
long double In=10;//Input double

//Loop Begin
while(In>0){
x=In;//convert double to int
Out= (x/In);//Out(test if whole number, will return 1)

//test for 1
////////////////
if(Out == 1 ){
    cout<<"[Whole Number] ";
}
////////////////
//test end

cout<<"In :"<<In<<", ";
cout<<"X :"<<x<<", ";
cout<<"Out :"<<Out<<endl;
In-=0.1;//decrease to finish loop (eventually)
}
//Loop End

cin.get();
return 0;
}

该程序将测试并输出double(In)中的整数。我意识到双重的准确性正在影响if语句,这就是为什么我无法获得&#34; [整数]&#34;结果。虽然我发现如果我使用(0.9999)&#34; if(Out&gt; = 0.9999)&#34;比较会起作用。但我不确定解决方案,请帮忙!非常感谢!

5 个答案:

答案 0 :(得分:0)

你的while循环永不停止,它是一个无限循环。你没有做任何关于&#34; In&#34;的价值的事情。在while循环中因此它总是大于0,因此是无限循环。

答案 1 :(得分:0)

您应该使用modf更直接地解决问题:

double int_part, frac_part;

frac_part = std::modf(in, &int_part);

if (frac_part == 0) {
  // int_part contains integer value.
} else {
  // process the double non-integer floating point value.
}

答案 2 :(得分:0)

您的代码完美无缺。如果从10.0中减去0.1,那么由于舍入错误,结果可能是一个整数,并且您的代码会准确地告诉您。代码没有错,你的期望是错误的。

if (Out >= 0.9999)

显然不是解决方案,因为如果In&gt; = 10000.0,它将始终为真。

答案 3 :(得分:0)

对于计算机将浮点数转换为二进制表示的方式,它们本质上是不准确的,因此使逻辑比较有些挑战(http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems)。在对浮点数进行此类比较时,通常会使用表示比较中可接受的最大误差的epsilon常量(http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm)。在您的情况下,您需要为epsilon选择合适的值(例如.000001)。然后将您的比较更改为:

if(abs(out - 1) < epsilon){ //Take the difference between out and 1
    cout<<"[Whole Number]"; //If it is "close enough" print to console

}

我更像是一个Java人,但我相信你需要#include stdlib.h才能使用abs()函数。

希望有所帮助!

答案 4 :(得分:-2)

尝试使用模数运算符:http://www.cprogramming.com/tutorial/modulus.html

if(在%1 == 0)之类的东西应该有用。