C++ 将负角度转换为正角度:涉及无效的操作数使用

C++ 将负角度转换为正角度:涉及无效的操作数使用,c++,c,math,C++,C,Math,我正在尝试将负角度(以度为单位)转换为正角度。但是我得到一个编译错误,它说: test.cpp将“double”和“int”类型的无效操作数转换为二进制“operator%”, test.cpp将“float”和“int”类型的无效操作数转换为二进制“operator%” 我的代码: double to_positive_angle(double angle) { return ((3600000 + angle) % 360); } float to_positive_angle(fl

我正在尝试将负角度(以度为单位)转换为正角度。但是我得到一个编译错误,它说:

test.cpp将“double”和“int”类型的无效操作数转换为二进制“operator%”,
test.cpp将“float”和“int”类型的无效操作数转换为二进制“operator%”

我的代码:

double to_positive_angle(double angle)
{
   return ((3600000 + angle) % 360);
}

float to_positive_angle(float angle)
{
   return ((3600000 + angle) % 360);
}
这显然是因为我试图在浮点和双精度上使用模运算符


有什么方法可以成功地将负角度(浮动)转换为正角度(浮动)?或者我可以克服模编译错误的方法?

您不能在浮点类型上使用模运算符。对此,您应该使用
fmod

return fmod( 3600000.0 + angle, 360.0 );

对上述操作可能引入的舍入和精度错误要小心。

好的,也许我有点慢,但我不确定为什么要使用3600000.0常量

如果你只是想把一个负角度转换成它的正值,你可以加上360.0直到你得到一个正数

double to_positive_angle(double angle)
{
   angle = fmod(angle, 360);
   while(angle < 0) { //pretty sure this comparison is valid for doubles and floats
     angle += 360.0;
   }

   return angle;
}
双到正角度(双角度)
{
角度=fmod(角度,360);
而(角度<0){//非常确定此比较对双精度和浮点值有效
角度+=360.0;
}
返回角;
}

此版本适用于所有可能的输入,而不仅仅是大于3600000的输入,并解决了您遇到的
%
问题

double to_positive_angle(double angle)
{
   angle = fmod(angle, 360);
   if (angle < 0) angle += 360;
   return angle;
}
双到正角度(双角度)
{
角度=fmod(角度,360);
如果(角度<0)角度+=360;
返回角;
}

我认为这是最聪明的方法:

void get_positve_angle(double theta)
{
    return fmod(fmod(theta,360)+360,360);
}

你的角度是以度为单位的,对吗?你为什么要在角度上加上3600000呢?他加上3600000是因为这是360的倍数,一个旋转,它会旋转大部分负角度(>=-3600000)这是一个非常迂腐的观点,但是所有处理角度的标准库都使用半径而不是度数,所以我会尝试让我编写的任何代码也使用弧度。当我只进行输出和输入时,我也会进行转换和从学位转换。@NathanDay:事实上有很多理由更喜欢在学位中工作。在弧度中,没有
x
,因此
cos(x)=0
sin(x)=1
等。这也意味着围绕圆的连续几轮将不会为
sin
cos
提供相同的值。有了学位,所有这些问题都消失了。此外,度数比另一种自然选择要好,
sinpi(x)
定义为
sin(pi*x)
,因为即使在这种形式下,也不可能精确表示30度和60度角(因此
sin(x)==0.5
,等等)。如果
angle
很大,速度会非常慢,并且可能永远不会终止,因为对于较大的
angle
@R。。很好。我甚至没有考虑过大的角度值。当然,循环可以做得更快,但保持一般,每次增加3600000,而不是360。为什么不呢?添加3600000将破坏精度,特别是在浮点版本中。我不能对此进行表决,因为它使用循环,而一步操作就足够了