C++ 比较双打

C++ 比较双打,c++,C++,我正在编写一个程序,它由一个while循环组成,该循环读取两个double并打印它们。该程序还打印较大的数字和较小的数字 这是我目前掌握的代码 int main() { // VARIABLE DECLARATIONS double a; double b; while (a,b != '|') //WHILE A & B DO NOT EQUAL '|'

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

这是我目前掌握的代码

int main()
{

                                    // VARIABLE DECLARATIONS 

    double a;
    double b;

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


        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." << "\n" ;

    }
}
intmain()
{
//变量声明
双a;
双b;
while(a,b!=“|”)//而a&b不等于“|”
{
cin>>a>>b;
cout
std::abs(a-b)<0.000001


当然,用你所认为的“几乎”替换常量。

< P>只测试它们的差值是否小于:
if(标准::abs(a-b)<1.0/10000000)
如果(a*1.0000001>b&&aif
您可以添加一个错误值(您的1.0/10000000.0),但通常最好使用乘法器,因此比较的精确度相同。

abs(a-b)<1.0/10000000
abs(a - b) < 1.0 / 10000000

以下是我如何在没有“捏造因素”的情况下测试平等性:


如果你想用a和b来衡量测试,你可以试着测试abs(a/b-1)(过时的链接->)

我也在读这本书,因为我们没有读到std::abs,所以我做了这样的事情:

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;

}
}
intmain()
{
双i1,i2;
而(cin>>i1>>i2){

if(i1Smells家庭作业,如果是这样的话,那么请添加标记家庭作业。有趣的是,这种气味能传播多远…@user484955:你真的知道
while(a,b!=''.'|')
的意思吗?你需要
while(a!='.'&&b!=''.'''.'))
。您使用的是逗号运算符,它对
a
求值,然后对
b!='''|'
求值,结果是
b!='|'
。换句话说,您有
while(b!='|')
,丢弃
a
。现在,你为什么要将其与之比较,我仍然不知道。@Capkutay:但是如果用户输入
“|”
操作符>>(std::istream&,double&
)将失败,因为|不是有效的双精度。您必须读取字符串,然后转换为双精度。其他答案是绝对误差值。这可能更快,但只有在您知道两个值的数量级时才准确。此外,请注意“误差”将按a和b的大小放大。@Fredrik:True,但OP指定“两个数字的差值小于某个常数”。当然,你可以拼凑一些东西来检查值上的指数是否相同,然后只在尾数上使用一个类似的常数。@Billy ONeil:是的,我只是想把它作为一个额外的信息。我看到太多的代码是由没有基本理解为什么“小于1e-10”的人编写的并不是总是努力对此保持沉默:-)。我没想到你会修改你的答案,我只是觉得自己写一个更完整的答案太过分了。比较只是问题的一个方面,当加法、乘法等时,你也会看到另一个方面。也许我错了,我认为OP还没有那方面的知识/经验。@Michael:是的,这就是为什么你从我这里得到了u+1的原因se of
std::numeric_limits
:PI尝试了这一点,但我得到了一个错误,即“重载'abs(double)'的调用不明确”卡普库泰:您是否包含
?这是
std::abs
工作所必需的。您也可能在某个地方有一个
使用命名空间std;
,这是一种不好的做法,可能会导致
std::abs
abs
在全局命名空间中发生冲突。(
abs
允许但不是必需放在全局名称空间中,因为它是从C继承的)通过使用名称空间std;
删除
,并根据需要限定对标准库的调用来修复此问题。1.“最喜欢的小数字`应该是
std::numeric\u limits::epsilon()
,2.无论如何,Log可能不是处理此问题的最佳方法。如果您希望进行类似的比较,则应检查符号和指数是否相等,然后比较有效位,以允许出现一些错误值。(使用
frexp
,它的性能应比
Log
log10
好得多)一个更好的答案是,它相对于a和b进行比较,但是乘比除更好。因为一个b可能是零。abs(a-b)std::abs(a-b)背后的原因吗?”@Mihai,这与双精度运算所能表示的最大整位数有关,即十五位数。因此,如果减法运算结果的绝对值小于减法运算所能产生的最小值,则称原始数不相等。@MichaelGoldshteyn:谢谢你花时间写这篇文章澄清。很好的解决方案。这是我第一次找到问题的核心,并提供了一个全面的解决方案。谢谢
abs(a - b) < 1.0 / 10000000
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\n";
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";
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;
}
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;

}
}