Как возвести в квадрат в c
Математические вычисления не ограничиваются лишь арифметическими действиями. Кроме них, можно ещё встретить корни, модули, логарифмы, тригонометрические функции и пр. Научимся же использовать подобные функции в своих программах.
Для использования математических функций нужно подключить заголовочный файл math.h . В ней определено много различных функций, но мы пока рассмотрим следующие:
Некоторые математические функции
fabs(x) модуль числа x
sqrt(x) квадратный корень из числа x
sin(x) синус числа x (х в радианах)
cos(x) косинус числа x (х в радианах)
pow(x, y) вычисление x y
exp(x) вычисление e x
log(x) натуральный логарифм числа x
log10(x) десятичный логарифм числа x
- Все функции возвращают значение типа double .
- Параметры функций – вещественные числа( double ), но можно передавать и целые числа. При этом произойдёт неявное преобразование типа . Компилятор из целого числа, например 3, сделает вещественное 3.0.
Примеры.
Даны длины катетов прямоугольного треугольника. Вычислить длину гипотенузы. Простая задачка на знание теоремы Пифагора.
Вычислить синус угла ввёденного с клавиатуры. Угол вводится в градусах.
В этой программе есть о чём поговорить. Тригонометрические функции, которые определены в math.h работают с радианной мерой угла. Людям же привычнее работать с градусами. Поэтому в данной программе мы предварительно перевели значение из градусов в радианы. Если этого не сделать, результат получится неправильным. Проверьте это самостоятельно.
Неявное преобразование типов
При явном преобразовании типа мы в скобках перед значением указывали тип, к которому нужно привести данное значение. В неявном преобразовании этого делать не нужно. Компилятор автоматически подберёт необходимый тип.
Неявное преобразование типов осуществляется в следующих случаях:
- перед передачей аргументов в функцию (как в нашем примере с корнем. Листинг 1.)
- выполнение арифметических операций с разными типами аргументов
- перед выполнением присваивания
Правила неявного преобразования типов
- если выполняются арифметические операции с разными типами аргументов. Оба аргумента приводятся к большему типу.
Порядок типов: int < float < double - при присваивании. Значение справа от оператора присваивания приводится к типу переменной слева от оператора присваивания. При этом, если больший тип присваивается меньшему, то может произойти потеря точности.
int+float будет автоматически преобразовано к float+float
float/int будет автоматически преобразовано к float/float
double*float будет преобразовано к double*double
int = double double будет преобразовано к int с потерей дробной части
float = int int будет преобразовано к float
Практика
Решите предложенные задачи:
Для удобства работы сразу переходите в полноэкранный режим
Степень в C, C++ и С#: как возвести число в любую степень, побитовые операции
Функция pow является частью библиотеки cmath, и поэтому её заголовок обязательно должен быть подключен в секции #include, как это сделано в примере. Также cout и cin являются частью библиотеки iostream и она у нас тоже подключена.
Давайте рассмотрим еще несколько примеров:
Пример, в котором степень и число задается пользователем:
Пояснение: возведение «2» в степень «n» реализуется с помощью сдвига, в общем случае:
- сдвиг влево (в сторону старших разрядов) реализует умножение на два,
- сдвиг вправо (в сторону младших разрядов) реализует деление на два.
Число n должно быть целочисленным.
Пример, в котором не используется функция pow()
В этом примере пользователь вводит числа n и a . Где n — число, которое возводится в степень, a — степень числа. В цикле for, мы умножаем число n на само себя a раз и в результате получаем степень.
5.3 – Остаток от деления и возведение в степень
Оператор остатка от деления – это оператор, который возвращает остаток после целочисленного деления. Например, 7/4 = 1 и остаток 3 . Следовательно, 7 % 4 = 3 . В качестве другого примера, 25/7 = 3 и остаток 4, таким образом, 25 % 7 = 4 . Оператор остатка от деления работает только с целочисленными операндами.
Этот оператор наиболее полезен для проверки того, делится ли одно число без остатка на другое число: если x % y принимает значение 0, то мы знаем, что x без остатка делится на y .
Вот результаты нескольких запусков этой программы:
Теперь давайте рассмотрим пример, в котором второе число больше первого:
Поначалу остаток от 2 может быть немного неочевидным, но это просто: 2/4 равно 0 (с использованием целочисленного деления), остаток 2. Когда второе число больше первого, второе число разделит первое число на 0 раз, поэтому первое число будет остатком.
Остаток от деления с отрицательными числами
Оператор остатка от деления также может работать с отрицательными операндами. x % y всегда возвращает результаты со знаком x .
Запускаем приведенную выше программу:
В обоих случаях вы можете видеть, что остаток принимает знак первого операнда.
Предупреждение
До C++11 оператор остатка от деления с отрицательным операндом мог давать как положительный, так и отрицательный результат. В C++11 это стало предсказуемым.
Где оператор возведения в степень?
Вы заметите, что оператор ^ (обычно используемый для обозначения возведения в степень в математике) – в C++ это побитовая операция XOR (исключающее ИЛИ) (описанная в уроке «O.3 – Битовые манипуляции с побитовыми операторами и битовыми масками»). В C++ нет оператора возведения в степень.
Чтобы выполнить возведение в степень в C++, включите с помощью #include заголовочный файл и используйте функцию pow() :
Обратите внимание, что параметры (и возвращаемое значение) функции pow() имеют тип double . Из-за ошибок округления в числах с плавающей запятой результаты pow() могут быть неточными (даже если вы передадите ей целочисленные значения или целые числа).
Если вы хотите выполнить целочисленное возведение в степень, лучше всего использовать для этого свою собственную функцию. Следующая функция реализует целочисленное возведение в степень (с использованием для повышения эффективности неинтуитивного алгоритма «возведения в возведения в квадрат»):
Не волнуйтесь, если вы не понимаете, как работает эта функция – чтобы вызывать ее, вам не нужно понимать ее внутреннюю работу.
Данная программа выводит следующее:
Предупреждение
В подавляющем большинстве случаев целочисленное возведение в степень приведет к переполнению целочисленного типа. Вероятно, именно поэтому такая функция не была включена в стандартную библиотеку.
Небольшой тест
Вопрос 1
Что будет результатом вычисления следующего выражения? 6 + 5 * 4 % 3
Поскольку * и % имеют более высокий приоритет, чем + , + будет вычисляться последним. Мы можем переписать наше выражение как 6 + (5 * 4 % 3) . Операторы * и % имеют одинаковый приоритет, поэтому мы должны учитывать ассоциативность для их вычисления. Ассоциативность для операторов * и % – слева направо, поэтому сначала мы вычисляем левый оператор. Мы можем переписать наше выражение так: 6 + ((5 * 4) % 3) .
6 + ((5 * 4) % 3) = 6 + (20 % 3) = 6 + 2 = 8
Вопрос 2
Напишите программу, которая просит пользователя ввести целое число и сообщает пользователю, четное это число или нечетное. Напишите функцию с именем isEven() , которая возвращает true (истину), если переданное ей целое число четное, и false (ложь) в противном случае. Чтобы проверить, является ли целочисленный параметр четным, используйте оператор остатка от деления.
Подсказка: в этой программе вам нужно будет использовать операторы if и оператор сравнения ( == ). Если вам нужно напомнить, как это сделать, смотрите урок «4.9 – Логические (булевы) значения».
Ваша программа должна давать следующий вывод:
Примечание: у вас может возникнуть соблазн написать функцию isEven() следующим образом:
Хотя это работает, но это сложнее, чем должно быть. Давайте посмотрим, как это можно упростить. Во-первых, давайте вытащим условное выражение if и присвоим его отдельному логическому значению:
Теперь обратите внимание, что оператор if выше, по сути, говорит: «Если isEvenNumber равно true , вернуть true , в противном случае, если isEvenNumber равно false , вернуть false ». Если это так, мы можем просто вернуть isEvenNumber :
И в этом случае, поскольку мы используем переменную isEvenNumber только один раз, мы могли бы также исключить и ее:
Похожие публикации:
- Как в экселе удалить скрытые строки в таблице
- Как в эксель сделать наценку в прайсе
- Как ввести с клавиатуры в java
- Как вернуть камеру на рабочий стол
Степень в C, C++ и С#: как возвести число в любую степень, побитовые операции
Функция pow является частью библиотеки cmath, и поэтому её заголовок обязательно должен быть подключен в секции #include, как это сделано в примере. Также cout и cin являются частью библиотеки iostream и она у нас тоже подключена.
Давайте рассмотрим еще несколько примеров:
Пример, в котором степень и число задается пользователем:
#include #include using namespace std; int main()< setlocale(0, ""); double a, b; cout > a; cout > b; cout int pow2(int n)
Пояснение: возведение «2» в степень «n» реализуется с помощью сдвига, в общем случае:
- сдвиг влево (в сторону старших разрядов) реализует умножение на два,
- сдвиг вправо (в сторону младших разрядов) реализует деление на два.
Число n должно быть целочисленным.
Пример, в котором не используется функция pow()
#include using namespace std; int main()< int n, a; cin>>n>>a; int tmp = n; if (a == 0) < coutfor(int i = 1; i < a; i++) < n*=tmp; >cout
В этом примере пользователь вводит числа n и a . Где n — число, которое возводится в степень, a — степень числа. В цикле for, мы умножаем число n на само себя a раз и в результате получаем степень.
Напишем свою функцию для возведение числа в степень:
double raiseToPow(double x, int power) < double result; int i; result =1.0; for (i=1, i<=power;i++) < result = result*x; >return(result); >
Возведение в степень на C#
Свежие записи
- SQL UPDATE: примеры обновления строк в таблице
- PHP: substr и мощные альтернативы, чтобы вырезать часть строки
- Степень в C, C++ и С#: как возвести число в любую степень, побитовые операции
- Скачать ShowKeyPlus: ссылка на последнюю официальную версию, скачивание, установка
- Как создать файл в Linux: 12 способов
- SQL INSERT INTO: примеры вставки строк в таблицу БД MySQL
- PHP: str_replace — замена или удаление подстроки в строке
- Функция date() в php: распространенные форматы, примеры, советы
- cURL в PHP: примеры POST, GET запросов с headers, cookie, JSON и многопоточностью
- JSON в PHP: примеры json_encode, json_decode, работа с кириллицей и utf-8
- Файл gitignore — примеры и документация
- Сортировка массивов в php: ksort, asort и прочие sort’ы
- jQuery onclick: как выполнить код при клике на кнопку
- 500 Internal Server Error — в чем причина?
- SMTP от Yandex: как отправить письма из PHP — пример настроек
- No such file or directory — в чем причина?
- Как получить первый элемент массива в php
- Cтроку в массив по разделителю в PHP: explode, str_split, strtok — что выбрать?
- 301 редирект на https с www через htaccess
- Как в php добавить к массиву другой массив?
- 301 редирект на https без www с помощью htaccess
- Регулярные выражения в PHP
- PHP json_decode — как декодировать результат в массив?
- Yii2 ActiveRecord шпаргалка по составлению запросов
- Поиск подстроки в строке с помощью PHP
- Отправка почты на php
- Как подключить php код в html
- Конвертировать массив в строку при помощи PHP
- Подключение одного php файла в другой
- Подборка ссылок для веб-разработчика
- Проблема с кириллицей в PHPWord
Как в C возвести число в степень: полный гайд для новичков
![]()
Возведение в степень — одна из базовых математических операций, широко используемая в программировании. Давайте разберем основные способы реализации этой операции на языке C.
Цикл с умножением числа на себя
Самый простой способ возвести число в степень — использовать цикл, который будет умножать число на себя столько раз, сколько указано в показателе степени. Например:
int power(int base, int exp) < int result = 1; for (int i = 0; i < exp; i++) < result *= base; >return result; >
Этот метод прост в реализации, но не очень эффективен при больших степенях. Количество операций умножения будет равно показателю степени, что может сильно замедлить выполнение программы.

Рекурсивная функция
Возведение в степень можно реализовать с использованием рекурсии — функция будет вызывать саму себя уменьшая показатель степени на 1:
int power(int base, int exp) < if (exp == 0) < return 1; >return base * power(base, exp - 1); >
Хотя такой подход изящен и прост для понимания, он тоже не оптимален для производительности из-за накладных расходов на вызов функции.
Возведение в квадрат
Чтобы ускорить вычисление степени, можно использовать возведение в квадрат:
int power(int base, int exp) < int result = 1; while (exp >1) < if (exp % 2 == 0) < base = base * base; exp = exp / 2; >else < result = result * base; exp = exp - 1; >> return result * base; >
Так мы сокращаем количество умножений, постепенно возводя основание в квадрат при четных значениях показателя.
Этот метод гораздо быстрее простого перебора, но при очень больших степенях тоже может замедлить выполнение.

Битовые операции
Еще один способ оптимизировать вычисление степени — использовать битовые операции и двоичное представление показателя:
int power(int base, int exp) < int result = 1; while (exp >0) < if (exp & 1) < result *= base; >exp >>= 1; base *= base; > return result; >
Здесь мы проверяем каждый бит показателя степени и умножаем на основание только если бит равен 1.
Такой подход позволяет минимизировать количество умножений за счет использования свойств двоичной системы счисления.
Описанные выше базовые методы позволяют реализовать возведение чисел в степень в Си разными способами. Давайте теперь рассмотрим работу со стандартными функциями.
Функция pow()
В языке C есть стандартная функция pow() для возведения в степень. Использование готовой функции pow() упрощает реализацию:
double result = pow(2.5, 3);
Функция pow() принимает два аргумента типа double и также возвращает double.
Перегрузки pow
Кроме стандартной версии pow() для double, в C++ есть перегруженные варианты:
- powf() для float
- powl() для long double
Это позволяет возводить в степень числа с разной точностью в зависимости от задачи.
Работа с отрицательными и дробными степенями
Функция pow() корректно обрабатывает отрицательные и дробные показатели степени:
double root = pow(27, 0.5); // возведение в квадратный корень double inverse = pow(4, -1); // возведение в отрицательную степень
Это расширяет область применения pow() для разных математических вычислений.
Обработка ошибок и ограничений
При использовании pow() важно учитывать возможные ошибки:
- Переполнение при слишком большом результате
- Потеря точности для маленьких значений
- Некорректные аргументы (отрицательное основание и дробная степень)
Чтобы избежать неправильных результатов, нужно проверять входные данные и ловить исключения.
Примеры использования pow()
Рассмотрим несколько практических примеров применения функции pow() в C:
// Возведение в куб double cube = pow(5, 3); // Вычисление площади круга const double PI = 3.14; double area = PI * pow(radius, 2); // Случайное число в диапазоне double random = pow(rand(), 1.0/difficulty);
Как видно из примеров, pow() может быть полезна для геометрических формул, генерации случайных чисел и многих других задач.
Сравнение производительности pow()
Хотя pow() удобна в использовании, по производительности она часто уступает оптимизированным алгоритмам.
Для критичных к скорости вычислений лучше реализовать собственные функции возведения в степень с использованием методов, описанных ранее.
Использование SSE инструкций
Один из способов оптимизировать вычисления с плавающей запятой — использовать SSE (Streaming SIMD Extensions) инструкции.
SSE позволяют выполнять операции над векторами данных параллельно, значительно ускоряя вычисления.
__m128 x = _mm_set_ps(1.0f, 2.0f, 3.0f, 4.0f); __m128 y = _mm_set_ps(5.0f, 6.0f, 7.0f, 8.0f); __m128 result = _mm_mul_ps(x, y); // умножение векторов
Реализовав алгоритмы возведения в степень через SSE можно добиться многократного прироста производительности.
Реализация с произвольной точностью
Стандартные типы данных в C не всегда достаточны для представления очень больших или очень маленьких чисел.
Чтобы возводить такие числа в степень, можно реализовать вычисления с произвольной точностью:
BigNum power(BigNum base, BigNum exp) < BigNum result(1); while (exp >0) < if (exp % 2 == 1) < result *= base; >base *= base; exp /= 2; > return result; >
Здесь BigNum — это класс для представления чисел с неограниченной точностью.
Такой подход позволяет точно вычислять любые степени, ценой больших накладных расходов.
Параллельные вычисления
Еще одно направление оптимизации — использовать многоядерные процессоры и ГПУ для параллельного вычисления степени.
Это особенно эффективно при многократном вызове pow() в циклах. Распараллеливание позволяет значительно сократить время выполнения.
Возведение в степень комплексных чисел
Помимо вещественных чисел, функция pow() также может применяться для возведения в степень комплексных чисел, например:
complex z1(1, 1); complex z2 = pow(z1, 2);
Для комплексных чисел вычисление pow() сложнее, чем для вещественных. Приходится вычислять модуль и аргумент по формулам:
z^n = |z|^n * (cos(n*arg(z)) + i*sin(n*arg(z)))
Где z — комплексное число, n — целая степень.
Таким образом, чтобы корректно возвести комплексное число в степень, нужно реализовать соответствующие тригонометрические функции.
Аппаратная оптимизация
Для максимальной производительности вычислений pow() имеет смысл задействовать аппаратные возможности — ГПУ или ПЛИС.
Например, на ПЛИС можно реализовать вычислительный модуль на базе умножителей и сложителей, оптимизированный для возведения в степень.
А на ГПУ функцию pow() можно выполнять массово в тысячах потоков параллельно, добиваясь огромной производительности.
Примеры библиотек
Рассмотрим несколько популярных математических библиотек, в которых реализована функция pow() с разной степенью оптимизации:
- STL — стандартная реализация
- Boost — с использованием SSE
- Eigen — векторизованная версия для матриц
Выбор конкретной библиотеки зависит от требований к производительности и необходимого набора функций.
Возведение в степень
Все реализуется встроенными средствами. Гуглиться за минуту — быстрое возведение в степерь. Там детально разобрано. Собственно сам код следующий:
int binpow (int a, int n) < int res = 1; while (n) if (n & 1) < res *= a; --n; >else < a *= a; n >>= 1; > return res; >
Отслеживать
ответ дан 14 дек 2015 в 10:23
112k 6 6 золотых знаков 93 93 серебряных знака 159 159 бронзовых знаков
Такой алгоритм лучше, когда основание float. В формате int всё детерминировано.
14 дек 2015 в 14:22
Простите за оффтоп, но чисто из интереса, какими средствами вы пользуетесь для компиляции кода?
14 дек 2015 в 15:28
Не поверите, компилятором! В случае с++ кода — gcc или сlang
14 дек 2015 в 15:30
Программа потрясает своим изяществом. Однако декремент n следует убрать и оператор else вместе со скобками — тоже. А содержимое этого else выполнять безусловно.
14 дек 2015 в 16:13
@YuriNegometyanov и получится: ru.stackoverflow.com/questions/273/…
14 дек 2015 в 19:29
Для x=2 — сдвигом единицы на y битов влево.
Если основание больше — использовать разложение по степеням x 2 t .
Формат int требует четыре пары умножений (3 31 =617673396283947), 64-битный формат — пять.
int power(int x, int y)
P.S. Программы без цикла и с циклом на PHP (переделывать там почти нечего):
function power($x, $y) < if($x==2) return 1function binpow ($a, $n) < $res = ($n & 1) ? $a : 1; while ($n)< $a *= $a; if (($n>>=1) & 1) < $res *= $a; >> return $res; > printf("
x = %d y = %d x**y = %d x**y = %d", $x=2, $y=15, power($x,$y), binpow($x,$y)); printf("
x = %d y = %d x**y = %d x**y = %d", $x=6, $y=4, power($x,$y), binpow($x,$y)); printf("
x = %d y = %d x**y = %d x**y = %d", $x=3, $y=10, power($x,$y), binpow($x,$y)); printf("
x = %d y = %d x**y = %d x**y = %d", $x=5, $y=5, power($x,$y), binpow($x,$y));
x = 2 y = 15 x**y = 32768 x**y = 32768 x = 6 y = 4 x**y = 1296 x**y = 1296 x = 3 y = 10 x**y = 59049 x**y = 59049 x = 5 y = 5 x**y = 3125 x**y = 3125
