Как возвести в степень в c
Перейти к содержимому

Как возвести в степень в c

  • автор:

Как возвести в степень в 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 только один раз, мы могли бы также исключить и ее:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *