Что fpstrict делает в Java?

Я считал спецификацию JVM для fpstrict модификатор, но все еще не полностью понимает то, что это означает.

Кто-либо может просветить меня?

8
задан Yuval Adam 24 March 2010 в 09:00
поделиться

3 ответа

По сути, он предписывает, что вычисления с затронутыми переменными float и double должны полностью соответствовать спецификации IEEE 754, включая промежуточные результаты.

Это имеет следующие последствия:

  • Обеспечение того, что один и тот же ввод всегда будет генерировать точно такой же результат на всех системах
  • Процессору может потребоваться дополнительная работа, что сделает его немного медленнее
  • Результаты будут в некоторых случаях менее точными (намного менее, в крайних случаях)

Редактировать: Более конкретно, многие современные CPU используют 80-битную арифметику с плавающей точкой ( "расширенная точность") внутри. Таким образом, они могут внутренне представлять некоторые числа в денормализованной форме, которые вызвали бы арифметическое переполнение или недополнение (давая Бесконечность или ноль, соответственно) в 32 или 64-битных плавающих числах; в пограничных случаях 80 бит просто позволяет сохранить большую точность. Когда такие числа встречаются как промежуточные результаты вычислений, но конечный результат находится внутри диапазона чисел, которые могут быть представлены 32/64-битными плавающими числами, то вы получаете "более правильный" результат на машинах, использующих 80-битную арифметику с плавающими числами, чем на машинах, которые ее не используют - или в коде, использующем strictfp.

11
ответ дан 5 December 2019 в 08:23
поделиться

Мне нравится этот ответ, который подходит к делу:

Он гарантирует, что ваши вычисления одинаково неверны на всех платформах.

6
ответ дан 5 December 2019 в 08:23
поделиться

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

Если вы не знакомы со стандартом IEEE 754 , сейчас не время его изучать. У вас, как мы говорим, есть рыба побольше, которую нужно жарить.

3
ответ дан 5 December 2019 в 08:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: