Угол математика, нормализовать до [-180,180] и мод против остатка () - PullRequest
2 голосов
/ 15 января 2020

Мне нужно преобразовать двойной угол / угол с плавающей точкой в ​​диапазон [-180,180], добавив или вычтя 360. Функция остатка работает, но я не уверен, почему.

x = remainder (x, 360);

Почему это производить диапазон [-180,180], а не [0,359.99999 ...]?

Я понимаю, что остаток и мод одинаковы для положительных чисел, но они работают по-разному для отрицательных чисел ... Я просто не видел хорошее объяснение происходящего.

Я счастлив, что это работает, конечно, но я не совсем понимаю, почему.

1 Ответ

3 голосов
/ 15 января 2020

Взято из cppreference :

Остаток IEEE с плавающей точкой операции деления x/y, рассчитанный этой функцией, является в точности значением x - n*y, где значение n является интегральным значением, ближайшим к точному значению x/y. Когда | nx / y | = ½, значение n выбрано четным.

В отличие от fmod(), возвращаемое значение не обязательно будет иметь тот же знак, что и x.

Если возвращаемое значение равно 0, оно будет иметь тот же знак, что и x.

Здесь происходит то, что функция remainder(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

Example2:

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

Таким образом, вы можете получить отрицательные числа в зависимости на вашей входной переменной.

...