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