Я посмотрел, что это делает, но есть ли у кого-нибудь пример, когда вы будете использовать strictfp
ключевое слово в Java? Кто-нибудь на самом деле нашел применение для этого?
Будут ли какие-либо побочные эффекты от того, что я просто добавлю это на все мои операции с плавающей запятой?
Ответы:
Strictfp гарантирует, что вы получите точно такие же результаты от ваших вычислений с плавающей запятой на каждой платформе. Если вы не используете strictfp, реализация JVM может использовать дополнительную точность там, где это возможно.
Из JLS :
Другими словами, речь идет о том, чтобы удостовериться в том, что Write-Once-Run-Anywhere действительно означает « Write-Once-Get-Equally-Wrong-Results-Everywhere» .
Благодаря строгому результату ваши результаты переносимы, без него они, скорее всего, будут точными.
источник
Википедия на самом деле имеет хорошую статью по этой теме здесь , со ссылкой на спецификацию Java.
Чтение между строк означает, что если вы не укажете
strictfp
, то у JVM и JIT-компилятора есть лицензия для вычисления ваших вычислений с плавающей запятой, как они захотят. В интересах скорости они, скорее всего, делегируют вычисления вашему процессору. С участиемstrictfp
, вычисления должны соответствовать арифметическим стандартам IEEE 754, что на практике, вероятно, означает, что JVM выполнит вычисления.Так почему вы хотите использовать
strictfp
? Один сценарий, который я вижу, - это распределенное приложение (или многопользовательская игра), где все вычисления с плавающей точкой должны быть детерминированными, независимо от того, какое оборудование или процессор лежат в основе. Какой компромисс? Скорее всего, время выполнения.источник
strictfp
вычисления используют даже бесполезный 8087 FPU. Это только тот случай, когда требуется немного осторожности. См stackoverflow.com/questions/18496560/...strictfp
обеспечивается соответствие стандарту IEEE 754 (так что вы получите одинаковый результат на всех платформах). Единственный недостаток, который я вижу, это то, что вы можете потерять преимущества наличия действительно хорошего FPU, доступного на вашем родном оборудовании.Все началось с истории,
Когда java разрабатывался Джеймсом Гослингом, Гербертом и остальной его командой. Они имели в виду эту сумасшедшую вещь под названием независимость от платформы . Они хотели сделать дуб (Ява)настолько лучше, что он будет работать точно так же на любой машине с другим набором команд, даже на разных операционных системах. Но возникла проблема с десятичными числами, также известными как языки с плавающей запятой и double в языках программирования. Некоторые машины были построены нацелены на эффективность, а остальные нацелены на точность. Таким образом, более поздние (более точные) машины имели размер с плавающей запятой равным 80 битам, тогда как прежние (более эффективные / более быстрые) машины имели 64-битные двойные числа. Но это противоречило основной идее построения языка, независимого от платформы. Кроме того, это может привести к потере точности / данных, когда код создается на некотором компьютере (с двойным размером 64 бита) и запускается на другом типе компьютера (с двойным размером 80 бит).
Увеличение размера можно допустить, но уменьшение не может быть. Таким образом, они столкнулись с понятием строгого, то есть строгого с плавающей точкой . Если вы используете это ключевое слово с классом / функцией, тогда его число с плавающей запятой и двойные числа будут иметь одинаковый размер на любой машине. т.е. 32/64-бит соответственно.
источник
Вот несколько ссылок:
jGuru: Для чего нужен модификатор strictfp ? Когда я рассмотрю возможность его использования?
strictfp - Глоссарий Java
И, наконец, актуальная спецификация языка Java, §15.4 Выражения строгого FP :
Я лично никогда не использовал это, хотя.
источник
Как уже упоминалось в других ответах, это приводит к тому, что промежуточные результаты с плавающей запятой соответствуют спецификации IEEE. В частности, процессоры x86 могут хранить промежуточные результаты с точностью, отличной от спецификации IEEE. Ситуация усложняется, когда JIT оптимизирует конкретное вычисление; порядок следования инструкций может быть разным каждый раз, что приводит к немного другому округлению
Накладные расходы, понесенные строгим fp, вероятно, будут сильно зависеть от процессора и JIT. Эта статья в Википедии о SSE2 похоже, дает представление о проблеме. Таким образом, если JIT может генерировать инструкции SSE для выполнения вычислений, кажется, что strictfp не будет иметь никаких накладных расходов.
В моем текущем проекте есть несколько мест, где я использую строгий fp. Есть точка, где потенциальные космические лучи должны быть удалены из значений пикселей. Если какой-то сторонний исследователь имеет такое же значение пикселей и космический луч перед ними, они должны получить то же результирующее значение, что и наше программное обеспечение.
источник
strictfp - это модификатор, который ограничивает вычисления с плавающей запятой согласно IEEE 754.
Это можно использовать для всего класса, например, «public strictfp class StrictFpModifierExample {}» или для метода «public strictfp void example ()». Если он используется в классе, то все методы будут следовать IEEE 754, а в случае метода - конкретный метод следуйте IEEE 754.
Почему он используется ?? ::: Поскольку разные платформы имеют различное аппаратное обеспечение с плавающей запятой, которое вычисляет с большей точностью и большим диапазоном значений, чем требует спецификация Java, что может давать различный вывод на различных пластинчатых формах. Таким образом, он подтверждает один и тот же вывод независимо от различий plateforms
Stringfp также обеспечивает преимущество в скорости и точности операций с плавающей запятой повышенной точности.
С этим ключевым словом нет недостатка, который мы можем использовать, когда выполняем вычисления с плавающей запятой.
Последнее, что я хочу сказать - это IEEE754, короче говоря, IEEE 754 определяет стандартный метод как для вычислений с плавающей запятой, так и для хранения значений с плавающей запятой либо в одном (32-битный, используется в Java-плавающих), или в двойном (64-битный, используется в Java) doubles) точность. Он также определяет нормы для промежуточных вычислений и для форматов с расширенной точностью.
источник
strictfp
является ключевым словом и может использоваться как модификатор без доступа к классам или методам (но не переменным). Пометка класса какstrictfp
означает, что любой код метода в классе будет соответствовать стандартным правилам IEEE 754 для чисел с плавающей запятой.Без этого модификатора плавающие точки, используемые в методах, могут вести себя в зависимости от платформы. С его помощью вы можете предсказать, как ваши плавающие точки будут вести себя независимо от базовой платформы, на которой работает JVM. Недостатком является то, что если базовая платформа способна поддерживать большую точность,
strictfp
метод не сможет воспользоваться этим.Если вы не объявляете класс как
strictfp
, вы все равно можете получитьstrictfp
поведение для каждого метода, объявив метод какstrictfp
.~ SCJP Sun® Сертифицированный программатор для Java ™ 6 - Кэти Сьерра и Берт Бейтс ~
источник
Пример ниже может помочь в понимании этого более ясно: В Java всякий раз, когда мы используем поиск точной информации для любой операции, например, если мы делаем double num1 = 10e + 102; двойное число2 = 8e + 10; результат = num1 + num2;
источник
Ключевое слово 'strictfp' используется для явного соответствия точности вычислений с плавающей запятой (float или double) в Java стандарту IEEE 754. Если вы не используете ключевое слово strictfp, точность с плавающей запятой зависит от аппаратного обеспечения целевой платформы.
Если интерфейс или класс объявляются с использованием Strongfp, то все методы и вложенные типы в этом интерфейсе или классе неявно являются строгими.
Ссылка ссылка
источник