这似乎微不足道,但我无法解决它。我想将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;
}
答案 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
不在-PI
到PI
的范围内,那么它应该被带回来范围(但需要注意的是,只有当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
)替换它不会改变结果。
无论如何,首先要解释一下你要做的事情可能是个好主意。我现在能做的只是解释症状。