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

saz*_*azr 4 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(float angle)
{
   return ((3600000 + angle) % 360);
}
Run Code Online (Sandbox Code Playgroud)

它显然是因为我试图在Float和Double上使用模数运算符.

我可以通过任何方式成功地将负角度(浮动)转换为正角度(浮动)吗?或者我可以克服模数编译错误的方法?

R..*_*R.. 11

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

double to_positive_angle(double angle)
{
   angle = fmod(angle, 360);
   if (angle < 0) angle += 360;
   return angle;
}
Run Code Online (Sandbox Code Playgroud)


pad*_*ddy 5

您不能在浮点类型上使用模运算符.你应该用fmod它.

return fmod( 3600000.0 + angle, 360.0 );
Run Code Online (Sandbox Code Playgroud)

请注意上述操作可能引入的舍入和精度错误.


Ala*_*lan 5

好吧,也许我有点慢,但我不确定你为什么使用 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果 `angle` 很大,这将非常慢,并且可能 **永远不会** 终止,因为 `angle+360==angle` 可能用于大 `angle`。 (7认同)