Theta范围和双重比较?

时间:2014-05-06 04:57:11

标签: c++ c double

这似乎微不足道,但我无法解决它。我想将Theta提高15度。但是,由radian进行内部计算。所以这就是我做的事情

    if ( m_a > PI )
        m_a = m_a - 2*PI;
    if ( m_a <= -PI )
        m_a = m_a + 2*PI;

第二个if语句的结果应为0.0。我得到的是5.55112e-016。它是如此之小,但当我做以下

     if ( m_a <= -PI )
            m_a = 0.0;

另外,我仍然得到5.55112e-016。我不确定为什么?我认为这是因为双重比较,所以我做了以下

   if ( m_a < -PI || isEqual(m_a, -PI) )
        m_a = m_a + 2*PI; // or m_a = 0.0

其中isEqual是(here链接)

bool isEqual(double x, double y) 
{
  const double epsilon = 0.000001/* some small number such as 1e-5 */;
  return std::fabs(x - y) <= epsilon * std::fabs(x);
  // see Knuth section 4.2.2 pages 217-218
}

我仍然无法将其设置为零。 PI为const double PI = 3.14159265358979323846;


编辑:

m_a是以弧度表示的角度(Theta),增加15度,初始值为零,如下所示

m_a += (DGR2RAD(15.0));

编辑:

#include <iostream>

const double PI = 3.14159265358979323846;  


double DGR2RAD(double angle) 
{ 
    return (angle * PI/180.0); 
}
double RAD2DGR(double angle) 
{ 
    return (angle * 180.0/PI);
}


int main()
{
    double Theta(0.0);

    for (unsigned int i(0); i < 25; ++i)
    {
        Theta += DGR2RAD(15.0);
        std::cout << -PI << " " << Theta << std::endl;
        if ( Theta > PI )
        Theta = Theta - 2*PI;
        else if ( Theta <= -PI )
        {
            std::cout << -PI << " " << Theta << std::endl;
            Theta = Theta + 2*PI;
        }
        std::cout << -PI << " " << Theta << std::endl;
    }

    std::cin.get();

    return 0;
}

1 个答案:

答案 0 :(得分:1)

由于缺乏问题的背景,我仍然很困惑,所以这是我最好的猜测。特别是,我不明白如何在角度Theta中添加15度与此问题相关。

首先,让我们来看看:

if ( m_a > PI )
    m_a = m_a - 2*PI;
if ( m_a <= -PI )
    m_a = m_a + 2*PI;

我猜这段代码的目的是确保如果m_a不在-PIPI的范围内,那么它应该被带回来范围(但需要注意的是,只有当m_a小于3 * PI且不小于-3 * PI时才有效。

您声称m_a在第二个if阻止后应为零,但是您确定第一个地方正在执行第二个if阻止吗?而可能发生的是第一个 if块已运行并将m_a设置为5.55112e-016。之后,由于if不小于或等于5.55112e-016,因此完全跳过了第二个-PI块。

由于5.55112e-016远不及-PI,因此尝试使用模糊检查(例如isEqual)替换它不会改变结果。

无论如何,首先要解释一下你要做的事情可能是个好主意。我现在能做的只是解释症状。