Когда я должен использовать ключевое слово “strictfp” в java?

StackOverflow https://stackoverflow.com/questions/517915

  •  21-08-2019
  •  | 
  •  

Вопрос

Я посмотрел, что это делает, но есть ли у кого-нибудь на самом деле пример того, когда вы могли бы использовать strictfp ключевое слово в Java?Кто-нибудь действительно нашел этому применение?

Будут ли какие-либо побочные эффекты от простого применения его ко всем моим операциям с плавающей запятой?

Это было полезно?

Решение

Strictfp гарантирует, что вы получите точно такие же результаты от ваших вычислений с плавающей запятой на каждой платформе.Если вы не используете strictfp, реализация JVM может свободно использовать дополнительную точность там, где это возможно.

Из JLS:

В выражении FP-strict все промежуточные значения должны быть элементами набора значений float или double набора значений, подразумевающего, что результаты из всех FP-строгих выражений должны быть те, которые предсказаны арифметикой IEEE 754 для операндов, представленных с использованием одинарных и двойных форматов.В пределах выражения, которое не является FP-строгим, предоставляется некоторая свобода действий для реализации, позволяющей использовать расширенный диапазон экспонент для представления промежуточных результатов;конечный эффект, грубо говоря, заключается в том, что вычисление может привести к "правильному ответу" в ситуациях, когда исключительное использование набора значений с плавающей запятой или double набор значений может привести к переполнению или недостаточному расходу.

Другими словами, речь идет о том, чтобы убедиться, что Запись-Один раз-Запуск-В любом месте на самом деле означает Напиши-Один-Раз-И Получишь-Одинаково-Неправильные-Результаты-Везде.

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

Другие советы

В Википедии действительно есть хорошая статья на эту тему здесь, со ссылкой на спецификацию Java.

Читая между строк, подразумевается, что если вы не укажете strictfp, тогда JVM и JIT-компилятор имеют лицензию на вычисление ваших вычислений с плавающей запятой так, как они хотят.В интересах скорости они, скорее всего, делегируют вычисления вашему процессору.С strictfp далее, вычисления должны соответствовать стандартам арифметики IEEE 754, что на практике, вероятно, означает, что вычисления будет выполнять JVM.

Итак, почему вы хотели бы использовать strictfp?Один сценарий, который я вижу, относится к распределенному приложению (или многопользовательской игре), где все вычисления с плавающей запятой должны быть детерминированными, независимо от базового оборудования или процессора.Каков же компромисс?Наиболее вероятное время выполнения.

Все началось с истории,

Когда java разрабатывалась Джеймсом Гослингом, Гербертом и остальными членами его команды.У них была на уме эта сумасшедшая штука под названием независимость от платформы.Они хотели сделать дуб (Ява) настолько лучше, что он будет работать точно так же на любой машине с другим набором команд, даже под управлением разных операционных систем.Но возникла проблема с десятичными числами, также известными в языках программирования как числа с плавающей запятой и double.Некоторые машины были построены с целью повышения эффективности, в то время как остальные были нацелены на точность.Таким образом, более поздние (более точные) машины имели размер с плавающей запятой в 80 бит, в то время как прежние (более эффективные / быстрые) машины имели 64-битные удвоения.Но это противоречило основной идее создания языка, независимого от платформы.Кроме того, это может привести к потере точности / данных, когда код создается на каком-либо компьютере (с двойным размером 64 бита) и выполняется на другом типе компьютера (с двойным размером 80 бит).

Увеличение размера можно допустить, но уменьшение размера - нельзя.Итак, они наткнулись на концепцию strictfp, т.е. строгая плавающая точка.Если вы используете это ключевое слово с классом / функцией, то его размер с плавающей запятой и удвоения будут одинаковыми на любом компьютере.т. е.32/64 -разрядный соответственно.

Вот несколько ссылок:

  • Использование strictfp (Технический совет Джойнта)
  • Джгуру: Для чего нужен модификатор strictfp?Когда я мог бы рассмотреть возможность его использования?

    По сути, все это сводится к тому, заботитесь ли вы о том, чтобы результаты выражений с плавающей запятой в вашем коде были быстрыми или предсказуемыми.Например, если вам нужны ответы, которые выдает ваш код, использующий значения с плавающей запятой для обеспечения согласованности на нескольких платформах, тогда используйте strictfp.

  • strictfp - Глоссарий Java

    Аппаратные средства с плавающей запятой вычисляют с большей точностью и с большим диапазоном значений, чем требуется спецификацией Java.Было бы странно, если бы некоторые платформы давали больше точности, чем другие.Когда вы используете strictfp модифицируя метод или класс, компилятор генерирует код, который строго соответствует спецификации Java для получения идентичных результатов на всех платформах.Без strictfp, является ли это немного более слабым, но не настолько слабым, чтобы использовать защитные биты в Pentium для обеспечения точности 80 бит.

  • И, наконец, фактическая спецификация языка Java, §15.4 FP-строгие выражения:

    Внутри выражения FP-strict все промежуточные значения должны быть элементами набора значений с плавающей запятой или набора значений double, подразумевая, что результаты всех выражений FP-strict должны соответствовать результатам, предсказанным арифметикой IEEE 754 для операндов, представленных с использованием одинарного и двойного форматов.В выражении, которое не является FP-строгим, реализации предоставляется некоторая свобода действий для использования расширенного диапазона показателей для представления промежуточных результатов;конечный эффект, грубо говоря, заключается в том, что вычисление может привести к "правильному ответу" в ситуациях, когда исключительное использование набора значений с плавающей запятой или двойного набора значений может привести к переполнению или недостаточному расходу.

Хотя лично я никогда им не пользовался.

Как упоминалось в других ответах, это приводит к тому, что промежуточные результаты с плавающей запятой соответствуют спецификации IEEE.В частности, процессоры x86 могут хранить промежуточные результаты с точностью, отличной от спецификации IEEE.Ситуация усложняется, когда JIT оптимизирует конкретное вычисление;порядок следования инструкций может каждый раз отличаться, что приводит к несколько иному округлению.

Накладные расходы, понесенные strictfp, вероятно, будут сильно зависеть от процессора и JIT.Эта статья в Википедии о SSE2 кажется, у него есть некоторое представление о проблеме.Таким образом, если JIT может генерировать инструкции SSE для выполнения вычисления, кажется, что strictfp не будет иметь никаких накладных расходов.

В моем текущем проекте есть несколько мест, где я использую strictfp.Существует момент, когда потенциальные космические лучи необходимо удалить из значений пикселей.Если какой-то сторонний исследователь имеет перед собой то же значение пикселя и космического луча, они должны получить то же результирующее значение, что и наше программное обеспечение.

  • strictfp - это модификатор, который ограничивает вычисления с плавающей запятой в соответствии с IEEE 754.

  • Это может быть использовано для всего класса, такого как "public strictfp class StrictFpModifierExample{}" или для метода "public strictfp void example()".Если он используется в классе, то все методы будут соответствовать стандарту IEEE 754, а если используется в методе, то конкретный метод будет соответствовать стандарту IEEE 754.

  • Почему это используется??:::Поскольку разные платформы имеют разное аппаратное обеспечение с плавающей запятой, которое вычисляет с большей точностью и большим диапазоном значений, чем требуется спецификацией java, что может приводить к разным выводам на diffrent plateforms.so это подтверждает один и тот же вывод независимо от разных форм таблиц

  • strictfp также гарантирует использование преимуществ скорости и точности операций с плавающей запятой расширенной точности.

  • У этого ключевого слова нет никаких недостатков, которые мы можем использовать при вычислениях с плавающей запятой

  • Мое последнее замечание - Что такое IEEE754 вкратце IEEE 754 определяет стандартный метод как для вычислений с плавающей запятой, так и для хранения значений с плавающей запятой либо с одинарной (32-разрядная, используемая в Java floats), либо с двойной (64-разрядная, используемая в Java doubles) точностью.Он также определяет нормы для промежуточных вычислений и для форматов повышенной точности.

strictfp является ключевым словом и может использоваться как модификатор non-access для классов или методов (но никогда не переменных).Маркировка класса как strictfp означает, что любой код метода в классе будет соответствовать стандартным правилам IEEE 754 для плавающих точек.

Без этого модификатора плавающие точки, используемые в методах, могли бы вести себя зависящим от платформы образом.С его помощью вы можете предсказать, как будут вести себя ваши плавающие точки независимо от базовой платформы, на которой запущена JVM.Недостатком является то, что если базовая платформа способна поддерживать большую точность, strictfp метод не сможет воспользоваться этим преимуществом.

Если вы не объявляете класс как strictfp, вы все еще можете получить strictfp поведение на основе метода за методом, путем объявления метода как strictfp.

~ Сертифицированный программист SCJP Sun® для Java ™ 6 - Кэти Сьерра и Берт Бейтс ~

Может ли приведенный ниже пример помочь в понимании этого более ясно :В java всякий раз, когда мы используем поиск точной информации для какой-либо операции, напримересли мы удвоим num1 = 10e + 102;двойное число 2 = 8e+ 10 ;результат = num1+ num2;

        The output will be so long and not precise, becasue it is precissed by the hardware e.g JVM and JIT has the license 
        as long as we dont have specify it Strictfp

Marking it Strictfp will make the result Uniform on every hardware and platform, because its precised value will be same
One scenario I can see is in a distributed application (or multiplayer game) where all floating-point calculations need to 
be deterministic no matter what the underlying hardware or CPU is.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top