gpt4 book ai didi

c++ - Theta 范围和双重比较?

转载 作者:行者123 更新时间:2023-11-28 06:53:16 29 4
gpt4 key购买 nike

这看起来微不足道,但我无法解决。我想将 Theta 增加 15 度。但是,内部是按弧度计算的。所以这就是我所做的

    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;
}

最佳答案

由于缺乏问题的上下文,我仍然很困惑,所以这是我最好的猜测。特别是,我不明白角度 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 block 之后应该为零,但是你确定第二个 if block 正在执行吗第一名? 可能 发生的是 第一个 if block 运行并将 m_a 设置为 5.55112e-016 。之后,第二个 if block 被完全跳过,因为 5.55112e-016 不小于或等于 -PI

由于 5.55112e-016-PI 相去甚远,尝试用更模糊的检查(例如 isEqual)替换它没有任何作用改变结果。

无论如何,最好先解释一下您要做什么。我现在所能做的就是解释症状。

关于c++ - Theta 范围和双重比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23486248/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com