如何在不将数字写入C的情况下将数字与其他数字进行比较?

时间:2016-10-03 12:46:24

标签: c if-statement sin

问题:我有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)

6 个答案:

答案 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的准确值以及其他改进的准确度。