Математичні функції і константи в мові 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, що гарантує ідентичність результатів на всіх платформах.
Перетворення числових типів
Часто виникає необхідність перетворити один числовий тип в інший.
На рис. 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.