【问题标题】:comparison of two doubles for positive and negative正负两个双打的比较
【发布时间】:2014-07-30 20:32:19
【问题描述】:

我想比较两个带有负值的双精度值。如果它们都是正值,我没有问题。但是,我无法确定其中一个值是否为负。这是我已经完成的。

#include <iostream>

const double PI = 3.14159265358979323846;  

bool isEqual(double a, double b, int decimals)
{
    double epsilon = pow(10.0, decimals);

    if( fabs( a - b) < epsilon)
        return true;

    return false;
}

int main()
{
    double Theta;
    Theta = 3.1415;
    if ( isEqual(Theta, -PI, 10) )
    {
        std::cout << "Theta == -PI " << Theta << " == " << -PI << std::endl;
    }

    Theta = -3.1415;
    if ( isEqual(Theta, -PI, 10) )
    {
        std::cout << "Theta == -PI " << Theta << " == " << -PI << std::endl;
    }

    std::cin.get();

    return 0;
} 

【问题讨论】:

  • 我认为您可能希望在您的 isEqual 定义中使用 pow(10.0, -decimals)。
  • epsilon = pow(10.0, decimals); 和 decimals == 10。所以根据你的功能,每对差异小于10000000000的数字都是相等的:)
  • 请澄清。你的实际问题是什么?如前所述,使用decimals = 10,这些测试都不会通过,您将看不到任何打印内容。这是你想要的吗?如果没有,你想做什么?
  • 您希望对isEqual() 的两个调用都在main() 中返回TRUE?还是只有第二个调用应该返回 true?
  • @MarkDickinson,谢谢它成功了。我接受它作为第一个答案,但是由于它是一个评论,我会考虑另一个答案,以便关闭这篇文章作为一个已解决的问题。

标签: c++ floating-point equality negative-number


【解决方案1】:

我猜你在isEqual 中有错字,你想要:

double epsilon = 1 / pow(10.0, decimals);

或者

double epsilon = pow(10.0, -decimals);

所以你的 espilon 将是 10^-(digits)

正如评论的那样,您当前的函数对于差值小于 10^digits 的任何数字都返回 true ...


注意事项:

  • 您也可以从std::numeric_limits&lt;double&gt;::epsilon() 获取 epsilon
  • 有关浮点数比较的更多信息,请参阅 this other post

【讨论】:

  • 或者,double epsilon = pow(10.0, -decimals);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
相关资源
最近更新 更多