В состав класса Math входит целый набор математических функций, которые нередко требуются для решения практических задач. В частности, чтобы извлечь квадратный корень из числа, применяется метод sqrt ():
double х = 4;
double у = Math.sqrt(x) ;
System.out.println(у); // выводит числовое значение 2.0
НА ЗАМЕТКУ! У методов println () и sqrt () имеется едва заметное, но существенное отличие. Метод println () принадлежит объекту System.out, определенному в классе System, тогда как метод sqrt() — классу Math, а не объекту. Такие методы называются статическими. Они будут рассматриваться в главе 4.
В Java не поддерживается операция возведения в степень. Для этого нужно вызывать метод pow () из класса Math. В результате выполнения приведенной ниже строки кода переменной у присваивается значение переменной х, возведенное в степень а. Оба параметра метода pow (), а также возвращаемое им значение относятся к типу double.
double у = Math.pow(х,а);
В состав класса Math входят также перечисленные ниже методы для вычисления обычных тригонометрических функций.
Math.sin() Math.cos() Math.tan() Math.atan() Math.atan2()
Кроме того, в него включены методы для вычисления экспоненциальной и обратной к ней логарифмической функции (натурального и десятичного логарифмов):
Math.ехр() Math.log() Math.loglO()
В данном классе определены также две константы — приближенное представление чисел 71 и е.
Math.PI () Math.Е ()
СОВЕТ. При вызове методов для математических вычислений класс Math можно не указывать ЯВНО, ВКЛЮЧИВ вместо этого в начало файла с исходным кодом следующее выражение:
import static java.lang.Math.*;
Например, при компиляции приведенной ниже строки кода ошибка не возникает.
System.out.println("The square root of \u03C0 is " + sqrt(PI));
Более подробно вопросы статического импортирования обсуждаются в главе 4.
НА ЗАМЕТКУ! Для повышения производительности методов из класса Math применяются процедуры из аппаратного модуля, выполняющего операции с плавающей точкой. Если для вас важнее не быстродействие, а предсказуемые результаты, пользуйтесь классом StrictMath. В нем реализуются алгоритмы из свободно распространяемой библиотеки fdlibm математических функций, гарантирующей идентичность результатов на всех платформах. Исходные коды, реализующие эти алгоритмы, можно найти по адресу http://www.netlib.org/fdlibm/index.html. (В библиотеке fdlibm каждая функция определена неоднократно, поэтому согласно стандарту IEEE 754 имена функций в классе StrictMath начинаются с буквы "е".)
Преобразование числовых типов
Нередко возникает потребность преобразовать один числовой тип в другой. На рис. 3.1 представлены допустимые преобразования.
Рис. 3.1. Допустимые преобразования числовых типов
Пять сплошных линий со стрелками на рис. 3.1 обозначают преобразования, которые выполняются без потери данных, а три штриховые линии со стрелками — преобразования, при которых может произойти потеря точности. Например, количество цифр в длинном целом числе 123456789 превышает количество цифр, которое может быть представлено типом float. Число, преобразованное в тип float, имеет тот же порядок, но несколько меньшую точность:
int n = 123456789;
float f = n; // значение переменной f равно 1.234567892Е8
Если у вашей дамы сердца сегодня праздник, то отличным подарком ей будет http://parfumsboutique.com.ua/lady.html.
Если два числовых значения объединяются бинарной операцией (например, n+f, где n — целочисленное значение, a f — значение с плавающей точкой), то перед выполнением операции оба операнда преобразуются в числовые значения одинакового типа по следующим правилам.
• Если хотя бы один из операндов относится к типу double, то и второй операнд преобразуется в тип double.
• Иначе, если хотя бы один из операндов относится к типу float, то и второй операнд преобразуется в тип float.
• Иначе, если хотя бы один из операндов относится к типу long, то и второй операнд преобразуется в тип long.
• Иначе оба операнда преобразуются в тип int. |