строгий фп
strictfp — устаревшее и избыточное зарезервированное слово в языке программирования Java . [1] [2] Ранее это ключевое слово использовалось в качестве модификатора, который ограничивал с плавающей запятой вычисления семантикой IEEE 754 для обеспечения переносимости. Ключевое слово strictfp было введено в Java вместе с виртуальной машиной Java (JVM) версии 1.2, а его функциональность была удалена в JVM версии 17. [2] Начиная с Java 17, требуется семантика IEEE 754, поэтому использование этого ключевого слова не имеет никакого эффекта.
Основа
[ редактировать ]Стандарт IEEE определяет стандартный метод как для вычислений с плавающей запятой , IEEE 754 так и для хранения значений с плавающей запятой в различных форматах.
включая одиночный (32-битный, используемый в Java float
) или двойной (64-битный, используемый в Java double
) точность.
Некоторое оборудование также предоставляет форматы расширенной точности , которые обеспечивают более высокую точность и/или больший диапазон показателей. В таких архитектурах может оказаться более эффективным вычисление промежуточных результатов с использованием таких расширенных форматов. Это позволяет избежать ошибок округления , переполнения и потери значения , которые могли бы возникнуть в противном случае, но может привести к тому, что программы будут выдавать разные выходные данные на таких архитектурах. Особенно дорого обходилось избегать использования повышенной точности на машинах x86 с традиционной архитектурой x87 с плавающей запятой. Хотя контролировать точность вычислений было легко, ограничение диапазона показателей для промежуточных результатов требовало дополнительных дорогостоящих инструкций.
До JVM 1.2 вычисления с плавающей запятой должны были быть строгими; то есть все промежуточные результаты с плавающей запятой должны были вести себя так, как если бы они были представлены с использованием одинарной или двойной точности IEEE. Это сделало дорогостоящим использование обычного оборудования на базе x87, чтобы обеспечить возникновение переполнений там, где это необходимо.
Начиная с JVM 1.2, промежуточным вычислениям по умолчанию разрешалось выходить за пределы стандартных диапазонов экспоненты, связанных с 32-битными и 64-битными форматами IEEE. Вместо этого им было разрешено быть представленными как члены набора значений «расширенная экспонента». На таких платформах, как x87, переполнение и опустошение могут происходить не там, где ожидалось, вместо этого давая, возможно, более значимые, но менее повторяемые результаты.
Поскольку плавающая запятая x87 больше не требуется на процессорах x86, поддерживающих SSE2 , Java 17 снова сделал все операции с плавающей запятой строгими, эффективно восстанавливая семантику до версии 1.2. [2]
Как это работает
[ редактировать ]При отсутствии переполнения или потери значения нет никакой разницы в результатах со strictfp или без него. Если повторяемость важна, можно использовать модификатор strictfp, чтобы гарантировать, что переполнение и опустошение происходят в одних и тех же местах на всех платформах. Без модификатора strictfp промежуточные результаты могут использовать больший диапазон экспоненты. [3]
The strictfp
Модификатор достигает этого, представляя все промежуточные значения как значения одинарной и двойной точности IEEE, как это происходило в более ранних версиях JVM. [4]
Использование
[ редактировать ]Программисты могут использовать модификатор strictfp
обеспечить выполнение расчетов как в предыдущих версиях; то есть только с использованием типов одинарной и двойной точности IEEE. Использование strictfp гарантирует, что результаты вычислений с плавающей запятой идентичны на всех платформах.
Его можно использовать для классов , интерфейсов и неабстрактных методов . [5] При применении к методу во всех вычислениях внутри метода используются строгие математические вычисления с плавающей запятой. Применительно к классу все вычисления внутри класса используют строгие математические вычисления с плавающей запятой. Выражения констант времени компиляции всегда должны использовать строгое поведение с плавающей запятой. [6]
Примеры
public strictfp class MyFPclass {
// ... contents of class here ...
}
Ссылки
[ редактировать ]- ^ «Спецификация языка Java. Глава 3. Лексическая структура» .
- ^ Перейти обратно: а б с «JEP 306: восстановить всегда строгую семантику с плавающей запятой» .
- ^ Гослинг, Джеймс; Джой, Билл; Стил, Гай Л. младший; Браха, Гилад; Бакли, Алекс; Смит, Дэниел (2017). «4.2.3 Типы, форматы и значения с плавающей запятой». Спецификация языка Java, Java SE 9 Edition . Аддисон-Уэсли Профессионал . Проверено 6 октября 2017 г.
- ^ Фланаган, Дэвид (март 2005 г.). Java в двух словах (Пятое изд.). О'Рейли Медиа . ISBN 978-0-596-00773-7 . Проверено 3 марта 2010 г.
- ^ Шильдт, Герберт (2007). Java: Руководство для начинающих (4-е изд.). Компании МакГроу-Хилл. ISBN 978-0-07-226384-8 .
- ^ Гослинг, Джеймс; Джой, Билл; Стил, Гай Л. младший; Браха, Гилад (2005). «15.4 FP-строгие выражения». Спецификация языка Java, третье издание . Аддисон-Уэсли Профессионал. п. 411. ИСБН 0-321-24678-0 . Проверено 22 марта 2016 г.