какой смысл в строгом модификаторе отсутствия доступа? - PullRequest
0 голосов
/ 06 января 2010

Я знаю, что это дублирующий вопрос. но я хочу знать это на примере. так может кто-нибудь объяснить это на примере?

Ссылка на повторяющийся пост: Когда мне следует использовать ключевое слово "strictfp" в Java?

Ответы [ 3 ]

4 голосов
/ 06 января 2010

Что ж, ответ Джирини подытоживает, но если вы ищете пример ..

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

Теперь предположим, что в вашей игре есть некоторая физика, которая может изменить исход игры (например, взрыв, выбрасывающий случайные обломки, которые МОГУТ причинить вам вред, если попадет).

Физика этой игры потенциально может отличаться на сервере (даже если она незначительная) от клиента (например, при преобразовании в целые числа для обнаружения столкновений она была округлена вниз вместо до ). В таком крайнем случае вы можете столкнуться с ситуацией, когда клиентская игра была не поражена обломками от взрыва, а серверная игра была - и теперь у вас есть разница в оценка, которая может некорректно аннулировать представление рекордов

Хотя strictfp, безусловно, не является «серебряной пулей», он в значительной степени навязывает некоторую последовательность «воспроизведения» инструкций на разных платформах.

1 голос
/ 28 ноября 2014

strictfp это очень особенное.

Давайте посмотрим на примере космического агентства .

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

Эти десятичные значения влияют на траекторию траектории космического корабля, на которую влияют мои константы, такие как трение, гравитация, тепло, влажность, полученный солнечный луч, выработанное электричество, многократное гравитационное тело, скорость, эффективность дымохода.

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

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

Для этого требования у нас есть строгий fp в Java.

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

1 голос
/ 06 января 2010

Это то, что спецификация языка Java говорит:

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

Что это означает, так это: арифметика с плавающей запятой (то есть вычисления с использованием типов float и double) в Java определена в соответствии со стандартом IEEE 754 , который говорит, как именно представлять ФП номера. Проблема состоит в том, что современные процессоры внутренне используют арифметику FP, которая не соответствует этому стандарту для промежуточных результатов - это, как правило, не проблема, поскольку на самом деле она и быстрее, и дает более точные результаты. Но это может означать, что программа выдаст несколько разные результаты в зависимости от того, на каком оборудовании она работает, что противоречит основным обещаниям независимости платформы Java.

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

В большинстве случаев вы будете иметь лучшую производительность, чем гарантированные идентичные результаты для разных платформ, и поэтому поведение strictfp является необязательным. На самом деле это было сделанным необязательным в Java 1.4 после того, как разработчики JVM поняли, что им приходится заставлять ЦП выполнять дополнительную работу, чтобы соответствовать спецификации, когда в большинстве случаев такое строгое соблюдение не имело преимуществ.

...