Модификатор strictfp
Для чего нужен данный модификатор? И с чем его можно использовать?
Отслеживать
22k 3 3 золотых знака 27 27 серебряных знаков 37 37 бронзовых знаков
задан 21 янв 2017 в 23:16
2,015 4 4 золотых знака 27 27 серебряных знаков 53 53 бронзовых знака
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
strictfp — это модификатор, введенный в java 1.2, ограничивающий точность вычислений с float и double по стандарту IEEE. Для чего это нужно? Чтобы обеспечить переносимость. Дело в том, что JVM использует всю возможную точность процессора, а она на разных системах разная, поэтому и результат может получиться разный.Данный модификатор используется в программах требующих точность вычислений превышающих IEEE (обычно, что-нибудь связное с наукой).
strictfp class StrictFPClass < double num1 = 10e+102; double num2 = 6e+08; double calculate() < return num1 + num2; >>
strictfp interface StrictFPInterface < double calculate(); strictfp double compute(); // compile error >
class StrictFPMethod < strictfp double computeTotal(double x, double y) < return x + y; >>
В классе он обозначает, что все методы будут на всех системах возвращать вещественные числа с одинаковой точностью. 0.112 и 0.113 Если эти числа сравнивать с точность до сотых, то они будут одинаковы. Пример, как точность влияет на вычисления. Его можно не использовать т.к. почти все компиляторы современные уже его за нас подставляют (где-то читал такое в мануале) Дополнил.
Software Development
strictfp — это модификатор, введенный в java 1.2, ограничивающий точность вычеслений с float и double по стандарту IEEE. Для чего это нужно? Чтобы обеспечить портабильность (переносимость). Дело в том, что JVM использует всю возможную точность процессора, а она на разных системах разная, поэтому и результат может получиться разный. Например, когда вы сравниваете два double 0.111 и 0.112 с точностью двух знаков после запятой, то они равны, а вот при точности трех знаков — нет.На самом деле, сегодняшние компиляторы сами ставят strictfp, потому что случаи, когда он не нужен, можно пересчитать по пальцам. Речь идет о программах, во-первых требующих точность вычислений превышающих IEEE (обычно, что-нибудь связаное с наукой), а во-вторых имеющих возможность требовать от пользователя определенного hardware.Сколько вы таких программ знаете?
Приложение A. Ключевые слова Java
Следующие 51 ключевое слово являются зарезервированными для использования в языке Java:
_ | do | instanceof | strictfp* |
abstract | double | int | super |
assert | else | interface | switch |
boolean | enum | long | synchronized |
break | extends | native | this |
byte | final | new | throw |
case | finally | package | throws |
catch | float | private | transient |
char | for | protected | try |
class | goto | public | void |
const | if | return | volatile |
continue | implements | short | while |
default | import | static |
Ключевое слово _ (символ нижнего подчёркивания) – является ключевым словом начиная с Java 9.
Ключевые слова goto и const являются зарезервированными словами C++, но в настоящее время не используются в Java. Это даёт возможность компиляторам Java идентифицировать их и создавать улучшенные сообщения об ошибках, если они появляются в Java программах.
Буквальные значения true, false и null не являются ключевыми словами, это буквальные значения, как например 100. Тем не менее, вы не можете использовать их в качестве идентификаторов, точно также, как вы не можете использовать 100 в качестве идентификатора.
*Ключевое слово strictfp – это модификатор метода или класса, который позволяет им использовать точные вычисления с плавающей точкой. Арифметика с плавающей точкой может выполняться в одном из двух режимов: strict и nonstrict. Режим strict гарантирует, что результат вычисления будет одинаковым во всех реализациях виртуальной машины Java. Режим nonstrict позволяет сохранять промежуточные результаты вычислений в расширенном формате, отличном от стандартного формата чисел с плавающей запятой IEEE. Расширенный формат зависит от машины и позволяет быстрее выполнять код. Однако, когда вы выполняете код с использованием nonstrict режима на разных JVM, вы не всегда можете получить точно такие же результаты. По умолчанию для вычислений с плавающей запятой используется nonstrict режим. Чтобы использовать strict режим в методе или классе, добавьте ключевое слово strictfp в объявление метода или класса. С плавающей запятой strict может дать вам немного лучшую точность, чем nonstrict с плавающей запятой, но различие затронет только некоторые приложения. Точность не наследуется; то есть наличие strictfp в объявлении класса или интерфейса не приводит к тому, что расширенные классы или интерфейсы будут strict.
Strictfp java что это
1. Здесь обсуждается Java , а не JavaScript ! Огромная просьба, по вопросам, связанным с JavaScript, SSI и им подобным обращаться в раздел WWW Masters или, на крайний случай, в Многошум.
2. В случае, если у вас возникают сомнения, в каком разделе следует задать свой вопрос, помещайте его в корневую ветку форума Java . В случае необходимости, он будет перемещен модераторами (с сохранением ссылки в корневом разделе).
3. Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
4. Не рекомендуется создавать несколько несвязанных вопросов в одной теме. Пожалуйста, создавайте по одной теме на вопрос.
Модераторы: dark_barker, wind
‘> strictfp модификатор , Для чего?
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
Сообщ. #1 , 20.04.05, 22:32
Рейтинг (т): 4
Кто-нибудь знает для чего используется strictfp модификатор? Заранее спасибо.
Сообщ. #2 , 21.04.05, 07:28
Unregistered
Впервые увидел такое, но гугл — друг человека. Абстрактно не так легко это объяснить, легче всего на примере. Общий смысл — классы/интерфейсы/методы, в которых использовано strictfp, используют «строгую арифметику на числах с плавающей точкой». Т.е. например равноправные арифметические действия исполняются слева направо, благодаря strictfp мы можем быть в этом уверены.
Пример http://java.sun.com/developer/JDCTechTips/2001/tt0410.html:
So what does FP-strict actually mean? Consider the following example:
public strictfp class FpDemo3 public static void main(String[] args) double d = 8e+307;
System.out.println(4.0 * d * 0.5);
System.out.println(2.0 * d);
>
>
The maximum value of a double (Double.MAX_VALUE) is approximately 1.8e+308. In the FpDemo3 example, the first expression is evaluated as:
because the Java programming language guarantees a left-to-right order of evaluation. When the first part of the expression is evaluated, the result is 32e+307 or 3.2e+308, which is larger than Double.MAX_VALUE.
Because the expression is FP-strict, the implementation is required to evaluate the whole expression as resulting in positive infinity (which the program prints as «Infinity»). This is true even though the later multiplication by 0.5 produces a final value for the expression of 1.6e+308, which is less than Double.MAX_VALUE.
By contrast, if the expression is not FP-strict, an implementation is allowed to use an extended exponent range to represent intermediate results. In the FpDemo3 example, this could keep the expression from overflowing, and produce a final result that is within range. An implementation is not required to do this; it can, in effect, use FP-strict rules everywhere.
Note that multiplication in this example is not associative, in that:
(4.0 * d) * 0.5 != 4.0 * (d * 0.5)
strictfp is important because its use guarantees common behavior across different Java implementations. In other words, you can know that the floating-point arithmetic in your application behaves the same when you move your application to a different Java implementation or hardware platform.