Какой смысл в строгом модификаторе отсутствия доступа?

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

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

3 ответа

Решение

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

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

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

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

В то время как strictfp это, конечно, не серебряная пуля, это имеет большое значение для навязывания некоторой последовательности "воспроизведения" инструкций на разных платформах.

Строгое его особенное.

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

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

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

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

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

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

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

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

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

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

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

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

Когда вы используете модификатор strictfp для метода или класса, компилятор генерирует код, который строго соответствует спецификации Java для получения идентичных результатов на всех платформах. Без строгого fp он немного слабее, но не настолько слаб, чтобы использовать защитные биты в Pentium для обеспечения точности 80 бит. С JET есть возможность использовать все 80 бит в расчете.

Другие вопросы по тегам