Я считал спецификацию JVM для fpstrict
модификатор, но все еще не полностью понимает то, что это означает.
Кто-либо может просветить меня?
По сути, он предписывает, что вычисления с затронутыми переменными float
и double
должны полностью соответствовать спецификации IEEE 754, включая промежуточные результаты.
Это имеет следующие последствия:
Редактировать:
Более конкретно, многие современные CPU используют 80-битную арифметику с плавающей точкой ( "расширенная точность") внутри. Таким образом, они могут внутренне представлять некоторые числа в денормализованной форме, которые вызвали бы арифметическое переполнение или недополнение (давая Бесконечность или ноль, соответственно) в 32 или 64-битных плавающих числах; в пограничных случаях 80 бит просто позволяет сохранить большую точность. Когда такие числа встречаются как промежуточные результаты вычислений, но конечный результат находится внутри диапазона чисел, которые могут быть представлены 32/64-битными плавающими числами, то вы получаете "более правильный" результат на машинах, использующих 80-битную арифметику с плавающими числами, чем на машинах, которые ее не используют - или в коде, использующем strictfp
.
Мне нравится этот ответ, который подходит к делу:
Он гарантирует, что ваши вычисления одинаково неверны на всех платформах.
strictfp
- это ключевое слово, которое может использоваться для изменения класса или метода, но не для переменной
. Пометка класса как strictfp означает, что любой код метода в классе будет
соответствовать стандартным правилам IEEE 754 для чисел с плавающей запятой. Без этого модификатора поведение с плавающей запятой
, используемое в методах, может зависеть от платформы.
Если вы не объявите класс как strictfp, вы все равно можете получить поведение strictfp для
метода за методом, объявив метод как strictfp.
Если вы не знакомы со стандартом IEEE 754 , сейчас не время его изучать. У вас, как мы говорим, есть рыба побольше, которую нужно жарить.