sq()
sq(x) возвращает квадрат числа, но как макрос вычисляет аргумент дважды — поэтому передавать в него вызовы функций вроде analogRead() опасно.
Полная статья
Описание
sq() возвращает квадрат числа, то есть значение, равное числу, умноженному на себя. Функция работает с любым числовым типом данных и удобна там, где нужно возвести значение в степень 2 без написания x * x вручную.
Синтаксис
sq(x)
Параметры
x — число, которое нужно возвести в квадрат. Принимается любой числовой тип данных: int, float, long и другие.
Возвращает
Квадрат переданного числа. Тип результата зависит от типа выражения, переданного в sq().
Пример кода
Вычислите квадрат x:
float x = 2.0;
void setup() {
Serial.begin(9600);
double square = sq(x);
Serial.print("The result is: ");
Serial.println(square);
}
void loop() {
}
Важное предупреждение
sq() реализована как макрос, а не как обычная функция. Это означает, что выражение внутри скобок подставляется в код буквально и вычисляется дважды. Если передать туда вызов функции или выражение с побочным эффектом, оно выполнится два раза, что приведёт к непредсказуемому результату.
Из-за этого sq() нельзя передавать внутрь скобок другие функции или сложные выражения.
Этот код даст неправильные результаты:
int inputSquared = sq(Serial.parseInt()); // избегайте этого
Вместо этого сначала сохраните результат в переменную, а затем передайте её в sq():
int input = Serial.parseInt(); // выносите другие операции за пределы функции sq
int inputSquared = sq(input);
Где применяется
- Вычисление расстояния между двумя точками по теореме Пифагора:
sqrt(sq(dx) + sq(dy)). - Расчёт мощности или энергии в физических формулах:
P = sq(I) * R. - Нормализация и масштабирование сигналов датчиков, где нужна квадратичная зависимость.
- Упрощение кода в математических вычислениях вместо повторного написания
x * x.
Практические замечания
- Тип результата определяется типом исходного выражения и обычными правилами арифметики C/C++. При работе с целыми числами следите за переполнением:
sq(30000)уже не помещается в 16-битныйint. - Квадрат отрицательного числа всегда положителен:
sq(-5)вернёт25. - Если входное значение велико, результат может выйти за пределы допустимого диапазона типа — учитывайте это при работе с большими числами.
- Никогда не пишите
sq(analogRead(pin))—analogRead()вызовется дважды и вы получите квадрат двух разных считанных значений. Всегда сохраняйте результат в переменную заранее. - Для возведения в степень, отличную от 2, используйте функцию
pow().