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

Как возвести число в степень в java

  • автор:

Java.lang.Math.pow() Method

If the absolute value of the first argument equals 1 and the second argument is infinite, then the result is NaN.

the first argument is positive zero and the second argument is greater than zero, or

the first argument is positive infinity and the second argument is less than zero,

then the result is positive zero.

the first argument is positive zero and the second argument is less than zero, or

the first argument is positive infinity and the second argument is greater than zero,

then the result is positive infinity.

the first argument is negative zero and the second argument is greater than zero but not a finite odd integer, or

the first argument is negative infinity and the second argument is less than zero but not a finite odd integer,

then the result is positive zero.

the first argument is negative zero and the second argument is a positive finite odd integer, or

the first argument is negative infinity and the second argument is a negative finite odd integer,

then the result is negative zero.

the first argument is negative zero and the second argument is less than zero but not a finite odd integer, or

the first argument is negative infinity and the second argument is greater than zero but not a finite odd integer,

then the result is positive infinity.

the first argument is negative zero and the second argument is a negative finite odd integer, or

the first argument is negative infinity and the second argument is a positive finite odd integer,

then the result is negative infinity.

If the first argument is finite and less than zero

if the second argument is a finite even integer, the result is equal to the result of raising the absolute value of the first argument to the power of the second argument

if the second argument is a finite odd integer, the result is equal to the negative of the result of raising the absolute value of the first argument to the power of the second argument

if the second argument is finite and not an integer, then the result is NaN.

If both arguments are integers, then the result is exactly equal to the mathematical result of raising the first argument to the power of the second argument if that result can in fact be represented exactly as a double value.

(In the foregoing descriptions, a floating-point value is considered to be an integer if and only if it is finite and a fixed point of the method ceil or, equivalently, a fixed point of the method floor. A value is a fixed point of a one-argument method if and only if the result of applying the method to the value is equal to the value.)

The computed result must be within 1 ULP of the exact result. Results must be semi-monotonic.

Изучаем Java

Класс Math содержит набор математических функций, часто оказывающихся не­обходимыми при решении разных задач.
Чтобы извлечь квадратный корень из числа, применяют метод sqrt.
double х = 4;
double у = Math.sqrt(х);
System.out.println(у); // Печатает число 2.0.

Между методами println и sqrt есть небольшая разница. Метод println дей­ствует на объект System, out, имея второй параметр у — число, подлежащее вы­воду. (Напомним, что out — это объект, определенный в классе System и пред­ставляющий собой стандартное устройство вывода.)

В то же время метод sqrt в классе Math не работает ни с одним объектом. Он имеет единственный параметр х — число, из которого нужно извлечь корень. Такие методы называются статиче­скими.

В языке Java нет оператора возведения в степень: для этого нужно использовать метод pow из класса Math.

Оператор
double у = Math.pow(x,a) ;
присваивает переменной у значение переменной х, возведенное в степень а.

Оба параметра метода pow, а также возвращаемое им значение имеют тип double.

Класс Math содержит обычные тригонометрические функции:
Math.sin
Math.cos
Math.tan
Math.atan
Math.atan2

Кроме этого, в него включены экспоненциальная и обратная к ней логарифмиче­ская функции (натуральный логарифм):
Math.exp
Math.log

В классе определены также две константы
Math.PI
Math.E,
обозначающие аппроксимации чисел Пи и е.

Для повышения своей производительности функции в классе Math используют про­граммы из встроенного модуля для вычислений с плавающей точкой.
Если точность вычислений важнее скорости их выполнения, используйте класс strictMath.
Он реализует алгоритмы из библиотеки «Freely Distributable Math Library» («Свободно распространяемая библиотека математических функций») fdlibm, гарантирующей идентичность результатов на всех платформах.

Исходные тексты программ, реали­зующих эти алгоритмы, можно найти на web-странице http://www.netlib.org/fdlibm/index.html. (В библиотеке fdlibm дается несколько определений каждой функции, класс StrictMath следует версии IEEE754, имена функций в которой на­чинаются с буквы «е».)

Преобразования числовых типов

Часто возникает необходимость преобразовать один числовой тип в другой.

На рис. 3.1 показаны разрешенные преобразования.

Шесть черных стрелок на рис. 3.1 обозначают преобразования, которые выпол­няются без потери информации. Три серые стрелки означают преобразования, при которых может произойти потеря точности. Например, количество цифр в большом целом числе 123456789 превышает количество цифр, которое может быть представ­лено типом float.
Число, преобразованное в тип float, имеет правильную величи­ну, но несколько меньшую точность.

int n = 123456789;
float f = n; // Число n равно 1.23456789268.

Рис. 3.1 Разрешенные преобразования числовых типов

Если два значения объединяются бинарным оператором (например n+f, где n — целое число, a f — число с плавающей точкой), то перед выполнением операции оба операнда преобразовываются в числа, имеющие одинаковый тип.

Если хотя бы один из операндов имеет тип double, то второй тоже преобразо­вывается в число типа double.

В противном случае, если хотя бы один из операндов имеет тип float, то второй тоже преобразовывается в число типа float.
В противном случае, если хотя бы один из операндов имеет тип long, то второй тоже преобразовывается в число типа long.
В противном случае оба операнда преобразовываются в числа типа int.

Приведение числовых типов

В предыдущем разделе мы видели, что при необходимости значения типа int ав­томатически преобразовываются в значения типа double. С другой стороны, есть не­сколько очевидных ситуаций, когда число типа double рассматривается как целое. Преобразования чисел в языке Java возможны, однако, разумеется, при этом может происходить потеря информации. Такие преобразования называются приведением типа (cast).

Синтаксически приведение типа задается парой скобок, внутри которых
указывается желательный тип, а затем — имя переменной. Например,
double х = 9.997;
int nx = (int)x;

Теперь в результате приведения значения с плавающей точкой к целому типу пере­менная nх равна 9, поскольку при этом дробная часть числа отбрасывается.

Если нужно округлить число с плавающей точкой до ближайшего целого числа (что во многих случаях является намного более полезным), используется метод
Math.round.
double x = 9.997;
int nx = (int) Math. round (x);

Теперь переменная nx равна 10. При вызове метода round по-прежнему нужно выполнять приведение поскольку возвращаемое им значение имеет тип long, и присвоить его переменной типа int можно лишь с помощью явного приведения.

При попытке привести число одного типа к другому результат может выйти за пре­делы допустимого диапазона. В этом случае результат будет усечен.

Например, вы­ражение (byte) 300 равно 44. Поэтому рекомендуется явно проверять заранее, бу­дет ли результат лежать в допустимом диапазоне после приведения типов.

Приведение между булевским и целыми типами невозможно. Это предотвращает появление ошибок. В редких случаях для того, чтобы привести булевское значе­ние к числовому типу, можно использовать условное выражение
b ? 1 : 0.

Class Math

Unlike some of the numeric methods of class StrictMath , all implementations of the equivalent functions of class Math are not defined to return the bit-for-bit same results. This relaxation permits better-performing implementations where strict reproducibility is not required.

By default many of the Math methods simply call the equivalent method in StrictMath for their implementation. Code generators are encouraged to use platform-specific native libraries or microprocessor instructions, where available, to provide higher-performance implementations of Math methods. Such higher-performance implementations still must conform to the specification for Math .

The quality of implementation specifications concern two properties, accuracy of the returned result and monotonicity of the method. Accuracy of the floating-point Math methods is measured in terms of ulps, units in the last place. For a given floating-point format, an ulp of a specific real number value is the distance between the two floating-point values bracketing that numerical value. When discussing the accuracy of a method as a whole rather than at a specific argument, the number of ulps cited is for the worst-case error at any argument. If a method always has an error less than 0.5 ulps, the method always returns the floating-point number nearest the exact result; such a method is correctly rounded. A correctly rounded method is generally the best a floating-point approximation can be; however, it is impractical for many floating-point methods to be correctly rounded. Instead, for the Math class, a larger error bound of 1 or 2 ulps is allowed for certain methods. Informally, with a 1 ulp error bound, when the exact result is a representable number, the exact result should be returned as the computed result; otherwise, either of the two floating-point values which bracket the exact result may be returned. For exact results large in magnitude, one of the endpoints of the bracket may be infinite. Besides accuracy at individual arguments, maintaining proper relations between the method at different arguments is also important. Therefore, most methods with more than 0.5 ulp errors are required to be semi-monotonic: whenever the mathematical function is non-decreasing, so is the floating-point approximation, likewise, whenever the mathematical function is non-increasing, so is the floating-point approximation. Not all approximations that have 1 ulp accuracy will automatically meet the monotonicity requirements.

The platform uses signed two’s complement integer arithmetic with int and long primitive types. The developer should choose the primitive type to ensure that arithmetic operations consistently produce correct results, which in some cases means the operations will not overflow the range of values of the computation. The best practice is to choose the primitive type and algorithm to avoid overflow. In cases where the size is int or long and overflow errors need to be detected, the methods whose names end with Exact throw an ArithmeticException when the results overflow.

Как возводить в степень в Java?

В этой статье мы расскажем о том, как выполнять возведение в степень в языке программирования Java. Читателю будут представлены 5 актуальных способов решения поставленной задачи.

Но прежде чем мы приступим к перечислению способов, давайте для начала вспомним, что же вообще представляет собой операция возведения:

Таким образом, речь идет об умножении числа на свое же значение n-е количество раз. Умножаемое число — это основание степени, а количество операций по умножению — показатель. Результат такого перемножения и будет называться возведением в степень. Для числа 3 3 результат будет равен 27, так как 3 х 3 х 3 = 27.

Теперь давайте рассмотрим, как это все реализуется в языке программирования Java.

Math pow

Использование класса Math — наиболее простой вариант решения поставленной задачи. На практике его применяют в большинстве ситуаций. Public class Math включает в себя математические методы, в том числе те, которые связаны с геометрией и тригонометрией. В этом классе методы реализованы в качестве статических, следовательно, есть возможность вызывать их через имя класса Math, не создавая объект класса.

public static int pow(int value, int powValue) <

return (int) Math.pow(value, powValue);

Здесь пришлось использовать операцию приведения типа (int), т. к. этот метод класса Math осуществляет возвращение значения типа double (аргументы, по сути, тоже double , однако там применяется неявное приведение типа).

Теперь рассмотрим несколько дополнительных вариантов решения поставленной задачи.

Значение квадрата числа

Начнем с наиболее простого и напишем метод по возведению в квадрат:

Выполняем вызов в main:

public static void main(String[] args) <

Как видим, возведение в квадрат сложностей не вызывает.

Число в степени

Чаще всего нам приходится работать не с квадратным значением числа, а с числом в определенной степени. Усложним предыдущий вариант и задействуем кастомное Java pow-значение:

public static void main(String[] args) <

public static int pow(int value, int powValue) <

int result = 1;

for (int a = 1; а <= powValue; а++) <

result = result * value;

return result;

Алгоритм несложен: мы как будто задаем точку отсчета result , а потом умножаем его на значение value столько, сколько будет работать цикл с powValue .

Рекурсия

Следующий вариант является уже более экзотичным.

Вы должны знать, что рекурсия позволяет методу осуществлять вызов самого себя. В языке программирования Java такие методы тоже есть и называются они рекурсивными.

На практике рекурсивно можно решать многие алгоритмические задачи. Наша — не исключение. Давайте выполним возведение в степень рекурсивно:

Как видно из реализации, существуют 2 момента:

  1. Условие выхода из рекурсии. Если возведенное значение степени достигает единицы, нас выбрасывает назад.
    1. Непосредственный механизм умножения value на результат вызова того же самого метода, однако с powValue — 1.

    Для совсем ленивых разработчиков существуют способы «из коробки». Рассмотрим один из них.

    BigInteger

    BigInteger — это класс, который обеспечивает хранение целых чисел произвольной величины. Здесь существуют разные арифметические методы, которые позволяют работать с числами.

    Выполняем возведение посредством BigInteger в Java:

    Тут все предельно просто и не нуждается в дополнительных разъяснениях, не так ли? Однако на сегодня все, теперь вы будете знать о разных способах, позволяющих возводить в степень в «Джава».

    По материалам: https://javarush.ru/groups/posts/2828-kak-vihpolnitjh-vozvedenie-v-stepenjh-v-java.

    Интересуют более продвинутые знания по языку программирования Java? Добро пожаловать на курсы в Otus!

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

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