Код оптимален или, по крайней мере, почти так. Некоторые платформы могут работать лучше с некоторыми вариантами.
Существует не один оператор целочисленного С, который обрабатывает это.
Проблемы, связанные с этим, состоит в том, что диапазон результатов: [-180:180]
и это 361 различное значение. Неясно, разрешено ли иметь func(180)
-180
.
Следующая задача состоит в том, чтобы код работал по всему диапазону [INT_MIN...INT_MAX]
, так как angle + 180
может переполняться. angle %= 360;
позаботится об этом.
Ниже приведено эффективное изменение кода OP, которое может работать быстрее на машинах с трубкой. Это только одна операция %
- возможно, самая дорогая. Положительный angle
возвращает [-179: 180] и отрицательный angle
возвращает [-180: 179]
int func2(int angle) {
angle %= 360;
return angle + 360*((angle < -180) - (angle > 180));
}
Ниже приведено один вкладыш, который возвращает значение [-180: 179]. Он не использует angle + 180
, так как это может переполняться.
int func3(int angle) {
return ((angle % 360) + (360+180))%360 - 180;
}
Существует <math.h>
функция double remainder(double x, double y);
, которая близко соответствует цели OP еще. (Возможно, доступно с C99.) Он вернет значения FP [-180: 180]. Примечание: int
может иметь целочисленный диапазон, превышающий то, что может точно представлять double
.
int func4(int angle) {
angle = remainder(angle, 360.0);
return angle;
}
Не вы просто ищете 'обратный станд :: остаток (угла, 180);'? – atlaste
Можете ли вы выбрать один из C и C++ для этого? – fuz
@atlaste Подтверждает то, что решает мои примеры, но это, к сожалению, не сработает. Например, ввод -190 должен давать 170, но 'остаток (-190, 180)' равен -10. –