Арифметика с плавающей запятой
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

В процессе выполнения арифметических операций над аргументами с плавающей запятой возможны переполнение разрядной сетки до бесконечности (результат превышает верхнюю границу диапазона изменения значений типа float или double) и потеря значимости – нередко до нуля (результат слишком мал для типа float или double). В результате вычисления некорректных выражений (таких как, например, деление бесконечности на бесконечность) получается значение NaN – «не число» (not a number).

Арифметические операции над конечными операндами с плавающей запятой, удовлетворяющими диапазонам точности представления значений float и double, выполняется вполне предсказуемо. Правило присваивания знака результату также традиционно: при умножении и делении чисел с одним знаком результат положителен, а если знаки различны – отрицателен.

Сложение двух бесконечностей даёт в результате такую же бесконечность, если их знаки одинаковы, и NaN – если знаки различны. При вычитании бесконечностей одного знака будет получено значение NaN; вычитание бесконечностей с разными знаками даёт в результате бесконечность с тем знаком, который имеется у левого операнда. Например, (∞ - (-∞)) есть ∞. Результат вычисления арифметического выражения, одним из операндов которого является NaN, всегда равен NaN. Переполнение даёт в итоге бесконечность соответствующего знака, а потеря значимости – значение (возможно, нулевое) соответствующего знака. При выполнении арифметических операций с плавающей запятой поддерживается отрицательный нуль, - 0.0, который в контексте операторов сравнения равен положительному нулю, + 0.0. Хотя оба нуля считаются равноценными, в конкретных выражениях они способны приводить к различным результатам. Так, например, результат вычисления выражения 1f/0f – равен положительной бесконечности, а выражения 1f/-0f – отрицательной бесконечности.

Если итогом исчезновения значащих разрядов является -0.0 и если -0.0 == 0.0, каким образом можно выявить факт получения отрицательного нуля? Следует поместить тестируемое нулевое значение в выражение, где знак способен себя проявить, и проверить результат. Пусть, например, x содержит нулевое значение; тогда выражение 1/x будет равно отрицательной бесконечности, если x - отрицательный нуль, и положительной бесконечности – в противном случае.

Правила выполнения операций с бесконечными величинами совпадают с теми, которые приняты в математике. Алгебраическое сложение любой конечной величины с бесконечностью даёт в результате ту же бесконечность. Например, (-∞ + x) равно -∞ при любом конечном значении x.

Бесконечные значения в Java-программе задаются с помощью символических констант POSITIVE_INFINITY (положительная бесконечность) и NEGATIVE_INFINITY (отрицательная бесконечность), объявленных в классах-оболочках Float и Double. Например, Double. NEGATIVE_INFINITY указывает на версию значения отрицательной бесконечности, определённую в классе Double.

Умножение бесконечности на нуль даёт в результате NaN. При умножении бесконечности на ненулевое конечное значение будет получена бесконечность соответствующего знака.

Операции деления и вычисления остатка в применении к аргументам с плавающей запятой способны давать в результате бесконечные значения или NaN, но никогда не приводят к выбрасыванию исключений. Результаты операций деления и вычисления остатка при различных комбинациях значений аргументов представлены в таблице 9.

Таблица 9

x y x/y x%y
Конечное значение ±0.0 ±∞ NaN
Конечное значение ±∞ ±0.0 x
±0.0 ±0.0 NaN NaN
±∞ Конечное значение ±∞ NaN
±∞ ±∞ NaN NaN

В остальных случаях оператор вычисления остатка (%) от деления аргументов с плавающей запятой действует аналогично случаю, когда он применятся к целочисленным аргументам.

Инкремент и декремент

В С существует 2 оператора, называемых операторами инкремента и декремента (++ и --) и являющихся сокращенным вариантом записи для сложения или вычитания из операнда единицы. Эти операторы уникальны в том плане, что могут использоваться как в префиксной, так и в постфиксной форме. Следующий пример иллюстрирует использование операторов инкремента и декремента.

class IncDec {

public static void main(String[] args) {

     int a = 1;

     int b = 2;

     int c = ++b;

     int d = a++;

     c++;

     System.out.println("a = " + a);

     System.out.println("b = " + b);

     System.out.println("c = " + c);

     System.out.println("d = " + d);

}

}

Результат выполнения данной программы будет таким:

a = 2

b = 3

c = 4

d = 1

Дата: 2019-02-19, просмотров: 232.