Jump to content

строгий фп

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 ...
}
  1. ^ «Спецификация языка Java. Глава 3. Лексическая структура» .
  2. ^ Перейти обратно: а б с «JEP 306: восстановить всегда строгую семантику с плавающей запятой» .
  3. ^ Гослинг, Джеймс; Джой, Билл; Стил, Гай Л. младший; Браха, Гилад; Бакли, Алекс; Смит, Дэниел (2017). «4.2.3 Типы, форматы и значения с плавающей запятой». Спецификация языка Java, Java SE 9 Edition . Аддисон-Уэсли Профессионал . Проверено 6 октября 2017 г.
  4. ^ Фланаган, Дэвид (март 2005 г.). Java в двух словах (Пятое изд.). О'Рейли Медиа . ISBN  978-0-596-00773-7 . Проверено 3 марта 2010 г.
  5. ^ Шильдт, Герберт (2007). Java: Руководство для начинающих (4-е изд.). Компании МакГроу-Хилл. ISBN  978-0-07-226384-8 .
  6. ^ Гослинг, Джеймс; Джой, Билл; Стил, Гай Л. младший; Браха, Гилад (2005). «15.4 FP-строгие выражения». Спецификация языка Java, третье издание . Аддисон-Уэсли Профессионал. п. 411. ИСБН  0-321-24678-0 . Проверено 22 марта 2016 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: fa1ce526575977a95dce90f11f8bb262__1711460220
URL1:https://arc.ask3.ru/arc/aa/fa/62/fa1ce526575977a95dce90f11f8bb262.html
Заголовок, (Title) документа по адресу, URL1:
strictfp - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)