Почему появился strictfp?

Я всегда читал, что strictfp ограничивает вычисления с плавающей запятой стандартом IEEE-754, но никогда не читал, почему возникла необходимость ограничивать результат вычислений в соответствии с этим стандартом?


person Ujjwal    schedule 09.12.2016    source источник
comment
Использование strictfp в определениях классов, интерфейсов и методов гарантирует, что вычисления с плавающей запятой останутся идентичными на всех платформах.   -  person Omoro    schedule 09.12.2016
comment
strictfp делает поведение строгим, следовательно, воспроизводимым, а значит, переносимым. Когда вам понадобится портативная арифметика FP? У меня нет личного опыта необходимости в этом, но я слышал, что игры - это один из возможных вариантов использования (хотя многие люди вместо этого используют арифметику с фиксированной точкой).   -  person Theodoros Chatzigiannakis    schedule 09.12.2016


Ответы (1)


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

Поскольку процессор борется за быстрое вычисление, округляет значения точности, а другой процессор - нет, и поэтому результат немного отличается. И это различие противоречило лозунгу Java WORA. Таким образом, разработчики Java пришли с модификатором strictfp, который ограничил результат арифметики с плавающей запятой стандартом IEEE-754.

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

person Ujjwal    schedule 09.12.2016
comment
Ответ на свой вопрос за 3 минуты заслуживает награды :) stackoverflow.com/a/31394053/706695 - person HRgiger; 09.12.2016
comment
только что я проверил, что разница между временем допроса и ответа на мой вопрос составляет 10 минут, а не 3 минуты. и через 10 мин лот можно будет прочитать. - person Ujjwal; 09.12.2016
comment
Почему вы задаете вопрос, если уже знаете ответ? Возможно, вы упускаете из виду то, что этот сайт не предназначен для создания контента. - person HRgiger; 09.12.2016