Как возвести в степень в c
Стандартная библиотека языка Си предоставляет ряд математических функций, которые определены в разных заголовочных файлах, но в основном определены в файле math.h .
Степерь числа. pow
Функция pow() , определенная в заголовочном файле math.h , возвращает степень числа:
Стоит отметить, что эта функция возвращает число типа double .
Для возведения в степень чисел типа float и long double также определены функции powf() и powl() соответственно.
Округление числа. round
Функция round() округляет число до ближайшего целого. В качестве параметра она принимает число типа double :
Квадратный корень. sqrt
Функция sqrt() возвращает квадратный корень числа типа double :
Для получения квадратного корня числа float также есть функция sqrtf() , а для числа типа long double — функция sqrtl()
Функция pow
В C++, эта функция перегружена в заголовочных файлах <complex> и <valarray> (смотреть pow комплексных чисел и pow в библиотеке массивов числовых значений).
В Си, определена только версия функции с типами данных её параметров, — double . Другие перегруженные версии этой функции есть только в C++.
Параметры:
- basis
Значение с плавающей точкой — основание. - exponent
Значение с плавающей точкой — степень.
Возвращаемое значение
Возведение значения basis в степень exponent .
Если величина результата настолько велика, что она не может быть представлена в объекте возвращаемого типа, возникает ошибка области допустимых значений, и функция возвращает значение HUGE_VAL с соответствующим ему знаком и устанавливает значение макроса ERRNO в ERANGE значение.
Если basis отрицательное и exponent не целое значение, или если basis равна нулю, а exponent — отрицательное, возникает ошибка области допустимых значений, и выполняется установка глобальной переменной ERRNO в значение EDOM .
Возведение в степень
Как быстро возвести целое число в целую степень, т.е. реализовать упрощённую функцию pow из <cmath> ?
Все реализуется встроенными средствами. Гуглиться за минуту — быстрое возведение в степерь. Там детально разобрано. Собственно сам код следующий:
Для x=2 — сдвигом единицы на y битов влево.
Если основание больше — использовать разложение по степеням x 2 t .
Формат int требует четыре пары умножений (3 31 =617673396283947), 64-битный формат — пять.
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 заголовочный файл <cmath> и используйте функцию 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 только один раз, мы могли бы также исключить и ее: