C 角度数学,规格化为[-180180]和mod vs rements()
我需要通过加或减360将双/浮动角度转换为[-180180]的范围。余数函数可以工作,但我不知道为什么C 角度数学,规格化为[-180180]和mod vs rements(),c,mod,C,Mod,我需要通过加或减360将双/浮动角度转换为[-180180]的范围。余数函数可以工作,但我不知道为什么 x = remainder (x, 360); 为什么这会产生[-180180]的范围而不是[0359.99999…] 我知道余数和mod对于正数是一样的,但是对于负数它们的工作方式不同。。。我只是没有看到一个很好的解释 当然,我很高兴这能奏效,但我真的不明白为什么。摘自: 通过此函数计算的除法运算的IEEE浮点余数x/y正好是值x-n*y,其中值n是最接近精确值x/y的整数值。当| n-x
x = remainder (x, 360);
为什么这会产生[-180180]的范围而不是[0359.99999…]
我知道余数和mod对于正数是一样的,但是对于负数它们的工作方式不同。。。我只是没有看到一个很好的解释
当然,我很高兴这能奏效,但我真的不明白为什么。摘自:
通过此函数计算的除法运算的IEEE浮点余数x/y
正好是值x-n*y
,其中值n
是最接近精确值x/y
的整数值。当| n-x/y |=½时,值n
被选择为偶数
与fmod()
相反,返回值不保证与x
具有相同的符号
如果返回值为0,则其符号与x相同
这里发生的是函数余数(x,y)
舍入到最接近的整数值,乘以y,然后从x中减去结果
例如:
remainder(160.0f, 360.0f)
result = 160 - round(160.0f / 360.0f) * 360
result = 160 - round(0.44f) * 360
result = 160 - (0 * 360)
result = 160.0f
例2:
remainder(190.0f, 360.0f)
result = 190 - round(190.0f / 360.0f) * 360
result = 190 - round(0.53f) * 360
result = 190 - (1 * 360)
result = -170.0f
因此,根据输入变量,最终可能会出现负数。将角度转换为[-pi,+pi]范围的惯用方法是
atan2(sin(x),cos(x))
。只是说..仅供参考,我将任何角度转换为+/-180的一般方法是:(角度%360+360)%360-180
另一种方法(通过避免负余数简化推理)是(角度+540)%360-180
。这只有一个部门,而不是两个部门。