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

Вы можете сделать это с помощью Reduce:

Object.entries(response.data.results)
    .reduce((acc, [key, { items }]) => ({
        ...acc,
        [key]: { // we can use the dynamic keys to add in our accumulated object
            items: items
                .map(itemId => stateItems.find(x => x.id === itemId)) // you can use find directly instead of findIndex then access
                .filter(Boolean) // we skip the unneeded elements
        }
    }), {});
250
задан Hash 24 January 2017 в 00:46
поделиться

4 ответа

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

От JLS:

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

, Другими словами, это о проверке, что Write-Once-Run-Anywhere на самом деле означает Write-Once-Get-Equally-Wrong-Results-Everywhere.

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

267
ответ дан Dan Dyer 23 November 2019 в 02:57
поделиться

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

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

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

65
ответ дан MattK 23 November 2019 в 02:57
поделиться

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

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

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

  • strictfp - Аппаратные средства вычислений с плавающей точкой Глоссария

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

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

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

у меня лично никогда не было использования для него, все же.

21
ответ дан Michael Myers 23 November 2019 в 02:57
поделиться

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

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

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

12
ответ дан Sean McCauliff 23 November 2019 в 02:57
поделиться
Другие вопросы по тегам:

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