Главная chevron_right Функции chevron_right Математика chevron_right sq()

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().

Полезные материалы