关于c ++:比较双打


Comparing doubles

我正在编写一个由while循环组成的程序,该循环读取两个双精度并打印它们。程序还打印较大的数字和较小的数字。

这就是迄今为止我掌握的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int main()
{

                                    // VARIABLE DECLARATIONS

    double a;
    double b;

    while (a,b != '|')              //WHILE A & B DO NOT EQUAL '|'
    {
        cin >>a >>b;
        cout << a << b <<"
"
;


        if (a<b)                    //IF A<B: SMALLER VALUE IS A
        cout <<"The smaller value is:" << a << endl
             <<"The larger value is:" << b << endl ;

        else if (b<a)               //ELSE IF B<A
            cout <<"The smaller value is:" << b << endl
                 <<"The larger value is:" << a << endl ;
        else if (b==a)
            cout <<"The two numbers you entered are equal." <<"
"
;

    }
}

下一步是让程序写出"数字几乎相等",如果两个数字相差小于1.0/10000000。我该怎么做?


这里是一个平等的知识测试,没有"软糖因子":

1
2
3
4
5
6
7
if (
    // Test 1: Very cheap, but can result in false negatives
    a==b ||
    // Test 2: More expensive, but comprehensive
    std::abs(a-b)<std::abs(std::min(a,b))*std::numeric_limits<double>::epsilon())
  std::cout <<"The numbers are equal
"
;

解释

第一个测试是一个简单的比较。当然,我们都知道,双精度值的比较结果,他们被认为不平等的CAN在结尾,甚至当他们是等价的。

一个双精度浮点值最重要的位的CAN hold of a number(15位是15.955≈)。因此,我们要调用两个值相等的if(约十五位)的第一场比赛。这是另一个单词,我们想要呼叫他们,如果他们是在一个平等的比例ε对方。这正是我的第二computes测试。

你可以选择添加更多的leeway缩尺比εa单显着,由于更多的浮点错误As a result of上迭代计算。这样做,添加误差因子的右手侧的第二测试的比较:

1
2
3
4
5
6
7
double error_factor=2.0;

if (a==b ||        
    std::abs(a-b)<std::abs(std::min(a,b))*std::numeric_limits<double>::epsilon()*
                  error_factor)
  std::cout <<"The numbers are equal
"
;

我无法给你一个固定的error_factor价值,因为它想depend on the量计算错误的是个怪物。然而,有一些测试,你应该能够找到一个合理的值是适合您的应用程序。要记住这是添加到误差因子(四)基于猜测你想卖回权独立领地-因子。

摘要

你可以使用下面的测试包(N线)功能:

1
2
3
4
5
6
inline bool logically_equal(double a, double b, double error_factor=1.0)
{
  return a==b ||
    std::abs(a-b)<std::abs(std::min(a,b))*std::numeric_limits<double>::epsilon()*
                  error_factor;
}


std::abs(a - b) < 0.000001

当然,无论你考虑的是替换"几乎是恒定的。


如果他们只是测试显示的是量比:)

1
2
3
if ( std::abs(a - b) < 1.0 / 10000000 )
  cout <<"The numbers are almost equal.
"
;


1
if (a * 1.0000001 > b  &&  a < b*1.0000001)

错误值(你可以添加你的10000000.0 1.0 /一般),但它是更好地使用乘数,比较的是同一个水平的准确性。


我现在阅读的书,因为我们没有给std::ABS,我做了什么。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
{
double i1,i2;
while(cin>> i1 >> i2){

if (i1<i2) {
        if ((i2-i1)<=0.0000001)  cout <<"Almost equal!"<<endl;
        else  cout <<"the smaller value is:"<< i1 << " the larger value is:" << i2 <<endl;
}
if (i1>i2) {
        if ((i1-i2)<=0.0000001)  cout <<"Almost equal!"<<endl;
        else  cout <<"the smaller value is:"<< i2 << " the larger value is:" << i1 <<endl;
}


else if (i1==i2) cout <<"the value :"<< i1 << " And the value :" << i2 <<"  are equal!"<<endl;

}
}

下面的文章:《I suggest
(过时的链接链接>比较浮点数)


如果你想测试一个表A和B,你可以尝试测试ABS(a/b<1)E,E是在您最喜爱的小号码,样的好处。但这实际上是在非对称状态A和B,所以它可以说是解决A靠近B,但B不靠近A.是浴室。它是更好地做ABS(log(a / b)<E在E,再次,是你最喜欢的小号码。但目前的额外的计算logarithms说,大学生是不可怕的。


1
abs(a - b) < 1.0 / 10000000