问题:我有IF语句if (x == 180 || x == 360 || x == 540
等等
如果不将180 + 180 * n
全部写出来,我该如何保持该列表?
额外信息:如果sin(x * M_PI / 180)为0,我想打印“不存在”。当sin(180),sin(360)等时为0。
编辑:我已经尝试了sin(x2 * M_PI / 180) == 0
但它不起作用(可能是因为它接近于0而不是0)
答案 0 :(得分:9)
使用模数操作数:%
if (x>0 && x%180==0) {..}
答案 1 :(得分:6)
查看mod %
运算符。在进行分割时,它会为您提供剩余部分。所以
(x % 180)
对于180的任何整数倍,将为0(假设您没有那么高,以至于您得到一些奇怪的回绕,比如说无符号数超过40亿。)
所以你可以使用。
if ((x % 180) == 0)
答案 2 :(得分:3)
if (180 <= x && x % 180 == 0)
应该这样做。 你为什么使用M_PI?
答案 3 :(得分:2)
如果x
是整数,则可以在IF语句中使用余数运算符:
if((x%180) == 0)
{
// ...
}
或者,如果x
不是整数,则可以使用fmod:
if(fabs(fmod(x, 180.0)) < DBL_EPSILON)
{
// ...
}
答案 4 :(得分:1)
草率但实用的测试是
if ( fabs(sin(a)) < FLT_EPSILON )
treataszero();
答案 5 :(得分:1)
什么似乎是OP更高级别的问题&#34;尝试犯罪(x2 * M_PI / 180)== 0但它不起作用(可能因为它接近0而不是0)&#34;目标是以x
的正弦值表示。
而不是x%180
,如果x
是浮点数,这是一个问题,
我们的想法是在转换为弧度之前先将sin/cos
参数缩小到90度范围。无需通过EPSILON比较放弃一些精确度。
请参阅c++ Sin and Cos以获取许多案例n*90 degrees
的准确值以及其他改进的准确度。