Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GoslingJava2.doc
Скачиваний:
139
Добавлен:
23.02.2016
Размер:
2.39 Mб
Скачать

5.15.3. Арифметика с плавающей точкой и стандарт ieee-754

Арифметика с плавающей точкой в языке Java представляет собой подмножество стандарта IEEE-754-1985. Тем читателям, которым необходимо полное понимание всех связанных с этим аспектов, следует обратиться к спецификации языка Java “The Java Language Specification”. Вот краткая сводка ключевых отличий:

  • Непрерываемая арифметика: в Java отсутствуют какие-либо исключения или иные события, сигнализирующие об исключительных состояниях в смысле IEEE: деление на ноль, переполнение, вырождение или потеря точности. В арифметике Java не предусмотрены какие-либо действия при появлении значения NaN.

  • Округление: в арифметике Java происходит округление к ближайшему  неточный результат округляется к ближайшему представимому значению; при наличии двух одинаково близких значений предпочтение отдается тому, у которого младший бит равен 0. Это соответствует стандарту IEEE. Однако при преобразовании числа с плавающей точкой к целому в Java происходит округление по направлению к нулю. Java не допускает выбираемых пользователем режимов округления для вычислений с плавающей точкой: округления вверх, вниз или по направлению к нулю.

  • Условные операции: в арифметике Java отсутствуют реляционные предикаты, которые бы реализовывали понятие упорядоченности, за исключением !=. Тем не менее все возможные случаи, кроме одного, могут быть смоделированы программистом с использованием существующих операций отношения и логического отрицания. Исключением является отношение “упорядочено, но не равно”, которое при необходимости может быть представлено в виде x<y || x>y.

  • Расширенные форматы: арифметика Java не поддерживает никаких расширенных форматов, за исключением того, что double может выступать в качестве расширения формата с одинарной точностью. Наличие других расширенных форматов не является требованием стандарта.

5.15.4. Конкатенация строк

Оператор + может применяться для конкатенации строк. Приведем пример:

String boo = "boo";

String cry = boo + "hoo";

cry += "!";

System.out.println(cry);

А вот как выглядит результат работы:

boohoo!

Оператор + также используется для конкатенации объектов типа String со строковым представлением любого примитивного типа или объекта. Например, следующий фрагмент заключает строку в кавычки-“елочки” (guillemet characters), которые используются для цитирования во многих европейских языках:

public static String guillemete(String quote) {

return '"' + quote + '"';

}

Неявное преобразование примитивных типов и объектов в строки происходит лишь при использовании + или += в выражениях со строками— и нигде более. Например, методу, вызываемому с параметром типа String, нужно передавать именно String— вы не сможете передать объект или float и рассчитывать на его неявное преобразование.

5.16. Операторы приращения и уменьшения

Операторы ++ и — применяются соответственно для приращения и уменьшения значений. Выражение i++ эквивалентно i = i + 1, если не считать того, что в первом случае i вычисляется всего один раз. Например, оператор

arr[where()]++;

всего один раз вызывает метод where и использует результат в качестве индекса массива. С другой стороны, в операторе

arr[where()] = arr[where()] + 1;

метод where будет вызываться дважды: один раз при вычислении правостороннего индекса, а во второй раз— при вычислении левостороннего индекса. Если при каждом вызове where возвращается новое значение, результат будет отличаться от приведенного выше выражения, в котором использован оператор++.

Операторы приращения и уменьшения могут быть либо префиксными, либо постфиксными— то есть стоять либо до, либо после своего операнда. Если оператор стоит перед операндом (префикс), то операция приращения/уменьшения выполняется до возвращения результата выражения. Если же оператор стоит после (постфикс), то операция выполняется после использования результата. Пример:

class IncOrder {

public static void main(String[] args) {

int i = 16;

System.out.println(++i + " " + i++ + " " + i);

}

}

Результат работы будет выглядеть так:

17 17 18

Первое выведенное значение равно i после выполнения префиксного приращения до 17; второе значение равно i после этого приращения, но до выполнения следующего, постфиксного приращения до 18; наконец, значение i выводится после его постфиксного приращения в середине оператора вывода.

Операции приращения и уменьшения ++ и — могут применяться к переменным типа char для получения следующего или предыдущего символа в кодировке Unicode.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]