Класс 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.
|