Math в java
Класс Math и пакет java.math
Класс Math содержит методы, связанные с геометрией и тригонометрией и прочей математики. Методы реализованы как static, поэтому можно сразу вызывать через Math.methodName() без создания экземпляра класса.
В классе определены две константы типа double: E и PI.
Популярные методы для тригонометрических функций принимают параметр типа double, выражающий угол в радианах.
- sin(double d)
- cos(double d)
- tan(double d)
- asin(double d)
- acos(double d)
- atan(double d)
- atan2(double y, double x)
Существуют также гиперболические функции: sinh(), cosh(), tanh().
Из них хорошо знакомы возведение в степень — pow(2.0, 3.0) вернёт 8.0.
Также популярен метод для извлечения квадратного корня — sqrt(4.0). Если аргумент меньше нуля, то возвращается NaN. Похожий метод cbrt() извлекает кубический корень. Если аргумент отрицательный, то и возвращаемое значение будет отрицательным: -27.0-> -3.0.
- abs() — возвращает абсолютное значение аргумента
- ceil() — возвращает наименьшее целое число, которое больше аргумента
- floor() — возвращает наибольшее целое число, которое меньше или равно аргументу
- max() — возвращает большее из двух чисел
- min() — возвращает меньшее из двух чисел
- nextAfter() — возвращает следующее значение после аргумента в заданном направлении
- nextUp() — возвращает следующее значение в положительном направлении
- rint() — возвращает ближайшее целое к аргументу
- round() — возвращает аргумент, округлённый вверх до ближайшего числа
- ulp() — возвращает дистанцию между значением и ближайшим большим значением
- copySign() — возвращает аргумент с тем же знаком, что у второго аргумента
- getExponent() — возвращает экспоненту
- IEEEremainder() — возвращает остаток от деления
- hypot() — возвращает длину гипотенузы
- random() — возвращает случайное число между 0 и 1 (единица в диапазон не входит)
- signum() — возвращает знак значения
- toDegrees() — преобразует радианы в градусы
- toRadians() — преобразует градусы в радианы
Вычислим наибольшее и наименьшее числа из двух заданных значений.
Большие числа
Если вам не хватает точности основных типов для представления целых и вещественных чисел, то можно использовать классы BigInteger и BigDecimal из пакета java.math, которые предназначены для выполнения действий с числами, состоящими из произвольного количества цифр.
Для преобразования обычного числа в число с произвольной точностью (называемое большим числом) вызывается статический метод valueOf():
При работе с большими числами нельзя использовать привычные математические операции с помощью + или * и т.п. Вместо них следует использовать специальные методы add() (сложение), multiply() (умножение), divide() (деление) и т.д.
В обычной практике эти числа используются редко.
Вычисления в Java. Math. StrictMath.
Дата добавления: 2013-12-23 ; просмотров: 4140 ; Нарушение авторских прав
Оператор continue
В некоторых ситуациях возникает потребность досрочно перейти к выполнению следующей итерации, проигнорировав часть операторов тела цикла, еще не выполненных в текущей итерации. Для этой цели в Java предусмотрен оператор continue. Ниже приведен пример, в котором оператор continue используется для того, чтобы в каждой строке печатались два числа.
public static void main(String args[]) <
System.out.print(» » + (i * j));
Оператор continue в этой программе приводит к завершению внутреннего цикла со счетчиком j и переходу к очередной итерации внешнего цикла со счетчиком i. В процессе работы эта программа выводит следующие строки:
0 5 10 15 20 25
0 6 12 18 24 30 36
0 7 14 21 28 35 42 49
0 8 16 24 32 40 48 56 64
0 9 18 27 36 45 54 63 72 81
В стандартной библиотеке языка Java содержатся два класса для произведения базовых математических операций, таких как возведение в степень, взятие логарифма, синуса, косинуса и так далее. Эти классы отличаются между собой различной точностью представления чисел на разных архитектурах процессора. Это классы Math и StrictMath
При использовании StrictMath получаем абсолютно одинаковый результат вычислений не зависимо от процессора, который установлен у пользователя программы. Это потому, что эта функция задумывалась создателями языка как базовая для всех примитивных типов данных и манипуляций с ними. Но как оказалось это не такая простая задача и обеспечение одинаковых результатов на различных платформах значительно уменьшают быстродействие. Большинство задач просто не требуют такой точности в вычислениях, для них гораздо важнее скорость этих вычислений. Это привело к разделению математической части библиотеки на быструю и выдающую одинаковый результат на разных процессорах.
Таким образом, если в решении вашей задачи важнее скорость — используйте класс Math, если же вам необходимо одинаковая работа (с точностью до бита) с примитивными типами данных, то ваш выбор — StrictMath. Константы и методы у них одинаковы, и более того некоторые методы класса Math просто вызывают аналогичные методы класса StrictMath.
Далее рассмотрим класс Math, содержащий различные математически функции. Рассмотрим некоторые из них:
1. System.out.println(Math.cbrt(8)); // 2.0
2. System.out.println(Math.ceil(2.1)); // 3.0
3. System.out.println(Math.copySign(3.4, -11.2)); // -3.4
4. System.out.println(Math.floor(9.999)); // 9.0
5. System.out.println(Math.hypot(3,4)); // 5.0
6. System.out.println(Math.max(3, 2)); // 3
7. System.out.println(Math.min(3, 2)); // 2
8. System.out.println(Math.nextAfter(4.45634D, -100)); //4.456339999999999
9. System.out.println(Math.nextUp(4.45634D)); // 4.456340000000001
10. System.out.println(Math.random()); // 0.45357720245424116
11. System.out.println(Math.round(4.5)); // 5
12. System.out.println(Math.round(Math.PI)); // выведет 3
13. System.out.println(Math.round(9.5)); // выведет 10
14. System.out.println(Math.round(9.5-0.001)); // выведет 9
15. System.out.println(Math.signum(-34.78)); // -1.0
16. System.out.println(Math.toDegrees(Math.PI)); // 180.0
17. System.out.println(Math.toRadians(180)); // 3.141592653589793
18. System.out.println(Math.abs(-2.33)); // выведет 2.33
Подведя итог можно сказать, что если добавлять к классу, интерфейсу и методам ключевое слово strictfp, то можем быть уверены, что на всех платформах при работе с числами мы получим одинаковый результат.
Все перечисленные функции принимают вещественные аргументы, а тип возвращаемого значения зависит от типа аргумента и от самой функции.
Кроме функций в рассматриваемом классе имеются две часто используемых константы:
В классе Math есть полезная функция без аргументов, которая позволяет генерировать псевдослучайные значения, т.е. при каждом вызове этой функции она будет возвращать новое значение.
Если требуется получить число из другого диапазона, то значение функции можно умножать на что-то, сдвигать и, при необходимости, приводить к целым числам.
System.out.println(Math.random()); // вещественное число из [0;1)
System.out.println(Math.random()+3); // вещественное число из [3;4)
System.out.println(Math.random()*5); // вещественное число из [0;5)
System.out.println( (int)(Math.random()*5) ); // целое число из [0;4]
System.out.println(Math.random()*5+3); // вещественное число из [3;8)
System.out.println( (int)(Math.random()*5+3)); // целое число из [3;7]
System.out.println( (int)(Math.random()*11)-5); // целое число из [-5;5]
Псевдослучайные числа имеют серьёзнейшие практические приложения и используются, например, в криптографии.
Потоки ввода/вывода и строки в Java
Для ввода данных используется класс Scanner из библиотеки пакетов Java.
Этот класс надо импортировать в той программе, где он будет использоваться. Это делается до начала открытого класса в коде программы.
В классе есть методы для чтения очередного символа заданного типа со стандартного потока ввода, а также для проверки существования такого символа.
Для работы с потоком ввода необходимо создать объект класса Scanner, при создании указав, с каким потоком ввода он будет связан. Стандартный поток ввода (клавиатура) в Java представлен объектом — System.in. А стандартный поток вывода (дисплей) — уже знакомым вам объектом System.out. Есть ещё стандартный поток для вывода ошибок — System.err.
import java.util.Scanner; // импортируем класс
public class Main <
public static void main(String[] args) <
Scanner sc = new Scanner(System.in); // создаём объект класса
Scanner
int i = 2;
System.out.print(«Введите целое число: «);
if(sc.hasNextInt()) < // возвращает истину если с потока
ввода можно считать целое число
i = sc.nextInt(); // считывает целое число с потока ввода и
сохраняем в переменную
System.out.println(i*2);
> else <
System.out.println(«Вы ввели не целое число»);
>
>
>
Метод hasNextDouble(), применённый объекту класса Scanner, проверяет, можно ли считать с потока ввода вещественное число типа double, а метод nextDouble() — считывает его. Если попытаться считать значение без предварительной проверки, то во время исполнения программы можно получить ошибку (отладчик заранее такую ошибку не обнаружит). Например, попробуйте в представленной далее программе ввести какое-то вещественное число:
import java.util.Scanner;
public class Main <
public static void main(String[] args) <
Scanner sc = new Scanner(System.in);
double i = sc.nextDouble(); // если ввести букву s, то случится ошибка во время исполнения
System.out.println(i/3);
>
>
Имеется также метод nextLine(), позволяющий считывать целую последовательность символов, т.е. строку, а, значит, полученное через этот метод значение нужно сохранять в объекте класса String. В следующем примере создаётся два таких объекта, потом в них поочередно записывается ввод пользователя, а далее на экран выводится одна строка, полученная объединением введённых последовательностей символов.
import java.util.Scanner;
public class Main <
public static void main(String[] args) <
Scanner sc = new Scanner(System.in);
String s1, s2;
s1 = sc.nextLine();
s2 = sc.nextLine();
System.out.println(s1 + s2);
>
>
Существует и метод hasNext(), проверяющий остались ли в потоке ввода какие-то символы.
В классе String существует масса полезных методов, которые можно применять к строкам (перед именем метода будем указывать тип того значения, которое он возвращает):
- int length() — возвращает длину строки (количество символов в ней);
- boolean isEmpty() — проверяет, пустая ли строка;
- String replace(a, b) — возвращает строку, где символ a (литерал или переменная типа char) заменён на символ b;
- String toLowerCase() — возвращает строку, где все символы исходной строки преобразованы к строчным;
- String toUpperCase() — возвращает строку, где все символы исходной строки преобразованы к прописным;
- boolean equals(s) — возвращает истинну, если строка к которой применён метод, совпадает со строкой s указанной в аргументе метода (с помощью оператора == строки сравнивать нельзя, как и любые другие объекты);
- int indexOf(ch) — возвращает индекс символа ch в строке (индекс это порядковый номер символа, но нумероваться символы начинают с нуля). Если символ совсем не будет найден, то возвратит -1. Если символ встречается в строке нескольо раз, то вовзвратит индекс его первого вхождения.
- int lastIndexOf(ch) — аналогичен предыдущему методу, но возвращает индекс последнего вхождения, если смивол встретился в строке несколько раз.
- int indexOf(ch,n) — возвращает индекс символа ch в строке, но начинает проверку с индекса n (индекс это порядковый номер символа, но нумероваться символы начинают с нуля).
- char charAt(n) — возвращает код символа, находящегося в строке под индексом n (индекс это порядковый номер символа, но нумероваться символы начинают с нуля).
public class Main <
public static void main(String[] args) <
String s1 = «firefox»;
System.out.println(s1.toUpperCase()); // выведет «FIREFOX»
String s2 = s1.replace(‘o’, ‘a’);
System.out.println(s2); // выведет «firefax»
System.out.println(s2.charAt(1)); // выведет «i»
int i;
i = s1.length();
System.out.println(i); // выведет 7
i = s1.indexOf(‘f’);
System.out.println(i); // выведет 0
i = s1.indexOf(‘r’);
System.out.println(i); // выведет 2
i = s1.lastIndexOf(‘f’);
System.out.println(i); // выведет 4
i = s1.indexOf(‘t’);
System.out.println(i); // выведет -1
i = s1.indexOf(‘r’,3);
System.out.println(i); // выведет -1
>
>
Пример программы, которая выведет на экран индексы всех пробелов в строке, введенноё пользователем с клавиатуры:
Класс Math
Класс Math содержит методы для выполнения основных числовых операций, таких как нахождение экспоненты, логарифма, квадратного корня и т. д.
Класс содержит две константы типа double: E и PI. Все методы в классе Math статичны.
abs(double a) — возвращает абсолютное значение (модуль) числа типа double.
abs(float a) — возвращает абсолютное значение (модуль) числа типа float .
abs(int a) — возвращает абсолютное значение (модуль) числа типа int.
abs(long a) — возвращает абсолютное значение (модуль) числа типа long.
acos(double a) — возвращает арккосинус значения. Возвращенный угол находится в диапазоне от 0 до pi.
asin(double a) — возвращает арксинус значения. Возвращенный угол в диапазоне от -pi/2 до pi/2.
atan(double a) — возвращает арктангенс значения. Возвращенный угол в диапазоне от-pi/2 до pi/2.
cbrt(double a) — возвращает кубический корень аргумента.
ceil(double a) — возвращает наименьшее целое число, которое больше аргумента.
copySign(double magnitude, double sign) — возвращает аргумент с тем же знаком, что у второго аргумента.
copySign(float magnitude, float sign) — возвращает аргумент с тем же знаком, что у второго аргумента.
cos(double a) — возвращает косинус аргумента.
cosh(double x) — возвращает гиперболический косинус аргумента.
decrementExact(int a) — возвращает значение аргумента уменьшенное на единицу.
decrementExact(long a) — возвращает значение аргумента уменьшенное на единицу.
exp(double a) — возвращает экспоненту аргумента.
floor(double a) — возвращает наибольшее целое число, которое меньше или равно аргументу.
hypot(double x, double y) — возвращает длину гипотенузы (sqrt(x 2 +y 2 )).
IEEEremainder(double f1, double f2) — возвращает остаток от деления f1 на f2.
incrementExact(int a) — возвращает значение аргумента увеличенное на единицу.
incrementExact(long a) — возвращает значение аргумента увеличенное на единицу.
log(double a) — возвращает натуральный логарифм (по основанию e).
log10(double a) — возвращает логарифм по основанию 10.
max(double a, double b) — возвращает больший из аргументов.
max(float a, float b) — возвращает больший из аргументов.
max(int a, int b) — возвращает больший из аргументов.
max(long a, long b) — возвращает больший из аргументов.
min(double a, double b) — возвращает меньший из аргументов.
min(float a, float b) — возвращает меньший из аргументов.
min(int a, int b) — возвращает меньший из аргументов.
min(long a, long b) — возвращает меньший из аргументов.
multiplyExact(int x, int y) — возвращает произведение аргументов (x*y).
multiplyExact(long x, long y) — возвращает произведение аргументов (x*y).
negateExact(int a) — возвращает отрицательное значение аргумента.
negateExact(long a) — возвращает отрицательное значение аргумента.
pow(double a, double b) — возвращает значение первого аргумента, возведенное в степень второго аргумента (a b )
random() — возвращает случайное число от 0.0 (включительно) до 1 (не включительно).
rint(double a) — возвращает округленное значение аргумента.
round(double a) — возвращает округленное значение аргумента.
signum(double a) — возвращает знак аргумента.
signum(float a) — возвращает знак аргумента.
sin(double a) — возвращает синус аргумента.
sinh(double a) — возвращает гиперболический синус аргумента.
sqrt(double a) — возвращает квадратный корень аргумента.
subtractExact(int x, int y) — возвращает разность аргументов (x-y).
subtractExact(long x, long y) — возвращает разность аргументов (x-y).
tan(double a) — возвращает тангенс аргумента.
tanh(double a) — возвращает гиперболический тангенс аргумента.
toDegrees() — преобразует радианы в градусы.
toIntExact(long value) — преобразует аргумент типа long в int.
toRadians() — преобразует градусы в радианы.
Math — реализует ряд наиболее известных математических функций¶
Класс состоит из набора статических методов, производящих наиболее популярные математические вычисления и двух констант, имеющих особое значение в математике — это число Пи и экспонента. Часто этот класс еще называют классом-утилитой (Utility class).
Так как все методы класса статические нет необходимости создавать экземпляр этого класса — поэтому он и не имеет открытого конструктора.
Нельзя так же и унаследовать этот класс, поскольку он объявлен с атрибутом final
class java.lang. Math ¶ E ¶
public static final double
public static final double
java.lang. abs ( double a ) ¶ java.lang. abs ( float a ) java.lang. abs ( int a ) java.lang. abs ( long a )
static [double, float, int, long]
Возвращает абсолютное значение
Вернет значения типа int, если в качестве параметра будут переданы значения типа byte, short, char.
java.lang. acos ( double a ) ¶
Вернет значение арккосинуса угла в диапазоне от 0 до PI
java.lang. asin ( double a ) ¶
Вернет значение арксинуса угла в диапазоне от -PI/2 до PI/2
java.lang. atan ( double a ) ¶
Вернет значение арктангенса угла в диапазоне от -PI/2 до PI/2
java.lang. ceil ( double a ) ¶
Возвращает наименьшее целое число которое больше a.
Угол задается в радианах
java.lang. floor ( double a ) ¶
Возвращает целое число которое меньше a.
Угол задается в радианах
java.lang. cos ( double a ) ¶
Возвращает косинус угла (3)
java.lang. IEEEremainder ( double a, double b ) ¶
Возвращает остаток от деления a/b по стандарту IEEE 754
java.lang. sin ( double a ) ¶
Возвращает косинус угла
java.lang. tan ( double a ) ¶
Возвращает тангенс угла (3)
java.lang. exp ( double a ) ¶
Возвращает e в степени числа a
java.lang. log ( double a ) ¶
Возвращает натуральный логарифм числа a
java.lang. max ( double a, double b ) ¶ java.lang. max ( float a, float b ) java.lang. max ( long a, long b ) java.lang. max ( int a, int b )
static [double, float, long, int]
Возвращает наибольшее из двух чисел
java.lang. min ( double a, double b ) ¶ java.lang. min ( float a, float b ) java.lang. min ( long a, long b ) java.lang. min ( int a, int b )
static [double, float, long, int]
Возвращает наименьшее из двух чисел типа int
java.lang. pow ( double a, double b ) ¶
Возвращает а в степени b
Возвращает случайное число в диапазоне от 0.0 до 1.0
java.lang. rint ( double a ) ¶
Возвращает int число, ближайшее к a
java.lang. round ( double a ) ¶
Возвращает значение типа long ближайшее по значению к а
java.lang. sqrt ( double a ) ¶
Возвращает положительный квадратный корень числа a
java.lang. toDegrees ( double angrad ) ¶
Преобразует значение угла из радианов в градусы
java.lang. toRadians ( double angdeg ) ¶
Преобразует значение угла из градусов в радианы
Изучаем Java
Вы здесь: Главная >> Java-учебник >> Математические функции и константы
Обучающие курсы:
Математические функции и константы в языке 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, имена функций в которой начинаются с буквы «е».)
Преобразования числовых типов
ОБУЧАЮЩИЙ ВЕБИНАР: рассчитан на новичков в web-разработке. После вебинара вы научитесь создавать сайты с помощью Java + Spring Boot — перейти
Часто возникает необходимость преобразовать один числовой тип в другой.
На рис. 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.
Сергей Владимирцев
29.01.2011