Арифметичні оператори
Java підтримує сім арифметичних операторів, які працюють з будь-якими числовими типами:
Java також підтримує мінус унарний (-) для зміни знака числа. Знак може бути змінений оператором такого типу:
Крім того, є й унарний плюс – наприклад, +3. Унарний плюс включений для симетрії, без нього неможливо було записувати константи виду +2.0.
5.15.1. Цілочисельна арифметика
Цілочисленна арифметика виконується з доповненням по модулю 2 - тобто при виході за межі свого діапазону допустимих значень (int або long) величина наводиться за модулем, що дорівнює величині діапазону. Таким чином, у цілісній арифметиці ніколи не відбувається переповнення, зустрічаються лише виходи значення за межі діапазону.
При цілісному розподілі відбувається округлення до нуля (тобто 7/2 дорівнює 3, а –7/2 дорівнює –3). Розподіл та залишок для цілих типів підкоряються наступному правилу:
Отже, 7%2 дорівнює 1, а -7%2 дорівнює -1. Поділ на нуль або перебування залишку від поділу на 0 у цілісній арифметиці не допускається і призводить до запуску виключення ArithmeticException.
Арифметичні операції з символами є цілими операціями після неявного приведення char до типу int.
5.15.2. Арифметика з плаваючою точкою
Для роботи з плаваючою точкою (як для подання, так і для здійснення операцій) в Java використовується стандарт IEEE 7541985. Відповідно до нього допускаються як переповнення у бік нескінченності (значення перевищує максимально
допустиме для double або float), так і виродження в нуль (значення стає занадто
малим та невідмінним від нуля для double або float). Також є спеціальне представлення NaN (“Not ANumber”, тобто “не-число”) для результатів неприпустимих операцій, наприклад, поділу на нуль.
Арифметичні операції з кінцевими операндами працюють відповідно до загальноприйнятих норм. Знаки виразів з плаваючою точкою також підпорядковуються цим правилам; перемноження двох чисел з однаковим знаком дає позитивний
результат, тоді як за перемноженні двох чисел із різними знаками результат буде негативним.
Складання двох нескінченностей з однаковим знаком дає нескінченність із тим самим знаком. Якщо знаки розрізняються – відповідь дорівнює NaN. Віднімання нескінченностей з однаковим знаком дає NaN; віднімання нескінченностей з різними знаками дає нескінченність, знак якої збігається зі знаком лівого операнда. Наприклад, (-(-)) дорівнює . Результат будь-якої арифметичної операції, у якій бере участь величина NaN, також дорівнює NaN. При переповненні виходить нескінченність із відповідним знаком, а при виродженні – нуль із відповідним знаком. У стандарті IEEE є негативний нуль, який дорівнює +0.0, проте 1f/0f дорівнює позитивної нескінченності, а 1f/-0f дорівнює негативної нескінченності.
Якщо -0.0 == 0.0, як відрізнити негативний нуль, отриманий у результаті виродження, від позитивного? Його слід використовувати у виразі, в якому бере участь знак, та перевірити результат. Наприклад, якщо значення x дорівнює негативному нулю, то вираз 1/x дорівнюватиме негативної нескінченності, а якщо позитивному — то позитивної нескінченності.
Операції з нескінченностями виконуються за стандартними математичними правилами. Додавання (або віднімання) кінцевого числа з будь-якою нескінченністю також дає нескінченність. Наприклад, (-+x) дає – для будь-якого кінцевого x.
Нескінченність може бути отримана за рахунок відповідноїарифметичні операції або використання імені нескінченності для об'єктів типу float або double: POSITIVE_INFINITY або NEGATIVE_INFINITY. Наприклад, Double.NEGATIVE_INFINITY представляє значення негативної нескінченності об'єктів типу double.
Множення нескінченності на нуль дає в результаті NaN. Примноження нескінченності на ненульове кінцеве число дає нескінченність із відповідним знаком.
Поділ, а також поділ із залишком може давати нескінченність або NaN, але ніколи не призводить до винятків. У таблиці наведено результати арифметичних операцій при різних значеннях операндів: