abs()
abs(x) возвращает абсолютное значение числа: отрицательное становится положительным, знак убирается — тип результата совпадает с типом аргумента.
Полная статья
Описание
abs(x) возвращает абсолютное значение числа: если число отрицательное — убирает минус, если положительное или равно нулю — оставляет как есть. Это удобно, когда нужна только величина разности или отклонения, а не его направление.
Синтаксис
Используйте следующую функцию для вычисления абсолютного значения x:
abs(x)
Параметры
x — число, абсолютное значение которого нужно найти. Может быть целым или числом с плавающей точкой.
Возвращает
Функция возвращает x, если x больше или равен нулю.
Функция возвращает -x, если x отрицательный.
Тип возвращаемого значения совпадает с типом аргумента.
Пример кода
Выводит абсолютное значение переменной x в Serial Monitor.
void setup() {
Serial.begin(9600);
while (!Serial) {
; // ожидание подключения serial порта. Нужно только для нативного USB порта
}
int x = 42;
Serial.print("The absolute value of ");
Serial.print(x);
Serial.print(" is ");
Serial.println(abs(x));
x = -42;
Serial.print("The absolute value of ");
Serial.print(x);
Serial.print(" is ");
Serial.println(abs(x));
}
void loop() {
}
Где применяется
- Измерение отклонения — когда нужно узнать, насколько показание датчика отличается от целевого значения, независимо от направления отклонения.
- Пороговая проверка — сравнение
abs(error) < thresholdвместо двух отдельных условийerror > -threshold && error < threshold. - Управление моторами — чтобы получить скорость без знака и отдельно управлять направлением вращения.
- Фильтрация шума — игнорирование небольших колебаний сигнала вокруг нуля.
Практические замечания
- Не вкладывайте вызовы других функций внутрь
abs(). Функция реализована как макрос, и такой код может вычислить аргумент несколько раз, что приведёт к непредсказуемому результату. Сначала сохраните результат в переменную, а затем передайте её вabs(). - Тип результата определяется типом аргумента:
abs(-3)вернётint,abs(-3.5f)вернётfloat. Следите за типами, чтобы не потерять дробную часть. - Если вы работаете с
long, убедитесь, что передаёте значение типаlong— иначе возможно переполнение при неявном приведении. - Для
floatиdoubleфункция работает корректно, включая граничные случаи вроде-0.0.
abs(a++); // избегайте этого — даёт неверные результаты
// используйте вместо этого:
abs(a);
a++; // выносите остальные вычисления за пределы функции