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 "; |
我无法给你一个固定的
摘要
你可以使用下面的测试包(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; } |
当然,无论你考虑的是替换"几乎是恒定的。
如果他们只是测试显示的是量比:)
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 |