Pregunta

He mirado hacia arriba lo que hace esto, pero ¿alguien realmente tienen un ejemplo de cuando se usaría la palabra clave strictfp en Java? Alguien ha encontrado de hecho un uso para esto?

¿Habría algún efectos secundarios de simplemente ponerlo en todas mis operaciones de punto flotante?

¿Fue útil?

Solución

strictfp asegura que se obtiene exactamente los mismos resultados de sus cálculos de punto flotante en todas las plataformas. Si no se utiliza strictfp, la implementación JVM es libre de utilizar precisión adicional cuando estén disponibles.

Desde el JLS :

  

En una expresión FP-estricta, todo   valores intermedios deben ser elementos   del valor flotante SET o el doble   valor establecido, lo que implica que los resultados   de todas las expresiones FP-estrictos deben estar   las predichas por IEEE 754 aritmética   sobre operandos representado usando solo   y formatos dobles. Al cabo de una   expresión que no es FP-estricta, algunos   margen de maniobra se concede por una   aplicación para utilizar un prolongado   gama exponente para representar   resultados intermedios; el efecto neto,   en términos generales, es que una   cálculo podría producir "la correcta   respuesta" en situaciones en exclusiva   uso del conjunto de valor flotante o doble   conjunto de valores podría resultar en desbordamiento o   underflow.

En otras palabras, se trata de asegurarse de que Write-Once-Ejecutar-en cualquier lugar significa en realidad Write-Once-Get-a partes iguales por erróneos de Resultados de todas partes .

Con strictfp sus resultados son portátiles, sin que ellos tienen más probabilidades de ser exacta.

Otros consejos

Wikipedia en realidad tiene un buen artículo sobre este tema aquí , con un enlace a la especificación Java .

Leyendo entre líneas, la implicación es que si no se especifica strictfp, a continuación, la JVM y el compilador JIT tienen licencia para calcular sus cálculos de punto flotante como quieran. En aras de la rapidez, lo más probable es delegar el cálculo de su procesador. Con <=> en adelante, los cálculos tienen que ajustarse a las normas IEEE 754 aritméticas, que, en la práctica, probablemente significa que la JVM va a hacer el cálculo.

Así que ¿por qué desea utilizar <=>? Un escenario que puedo ver es en una aplicación distribuida (o juego multijugador), donde todos los cálculos de punto flotante deben ser determinista, no importa cuál es el hardware o CPU subyacente. ¿Cuál es la relación inversa? La mayor tiempo de ejecución probable.

Todo comenzó con una historia,

Cuando java estaba siendo desarrollado por James Gosling, Herbert y resto de su equipo. Tenían esta locura en la mente llamado plataforma de independencia . Querían hacer roble (Java) mucho mejor que iría exactamente igual en cualquier máquina que tiene el conjunto de instrucciones diferentes, incluso ejecutar diferentes sistemas operativos. Sin embargo, había un problema con los números decimales de punto también conocidos como punto flotante y dobles en lenguajes de programación. Algunas máquinas se construyeron eficiencia de la focalización mientras que el resto se dirige a la precisión. Por lo tanto, las máquinas posteriores (más precisos) tenían el tamaño de punto flotante de 80 bits que mientras que el primero (máquinas más eficientes / rápido) tenían 64 dobles bits. Sin embargo, esto estaba en contra de allí idea central de la construcción de un lenguaje independiente de la plataforma. Además, esto podría conducir a la pérdida de precisión / datos cuando un código está construido sobre una máquina (que tiene el doble de tamaño de 64 bits) y ejecutarse en otro tipo de máquina (que tiene un doble del tamaño de 80 bits).

Hasta-Dimensionamiento se puede tolerar, pero la reducción del tamaño no puede ser. Por lo tanto, se encontraron con un concepto de strictfp es decir, estricta de coma flotante . Si se utiliza esta palabra clave con una clase / función entonces su punto flotante y dobles tienen un tamaño constante en cualquier máquina. es decir, 32/64 bits respectivamente.

Aquí hay varias referencias:

  • Usando strictfp (JDC Tech Tip)
  • jGuru: ¿Cuál es el modificador de strictfp? ¿Cuándo se debe considerar el uso de ella?

      

    Básicamente, lo que todo se reduce a es si o no te importa que los resultados de las expresiones de punto flotante en el código son rápidos ni predecible. Por ejemplo, si usted necesita las respuestas que su código se le ocurre que utiliza valores de coma flotante para ser consistente a través de múltiples plataformas a continuación, utilizar strictfp.

  • strictfp - Java Glosario

      

    hardware de punto flotante calcula con mayor precisión, y con un mayor rango de valores de la especificación Java requiere. Sería confuso si algunas plataformas dieron más precisión que otros. Cuando se utiliza el modificador <=> en un método o clase, el compilador genera código que se adhiere estrictamente a la especificación de Java para obtener resultados idénticos en todas las plataformas. Sin <=>, es que es un poco más laxa, pero no tan laxa como para utilizar los bits de guardia en el Pentium para dar 80 bits de precisión.

  • Y por último el actual especificación del lenguaje Java, §15.4 Expresiones FP-estrictas :

      

    Dentro de una expresión FP-estricta, todos los valores intermedios deben ser elementos del valor flotante establecer o el conjunto de valor doble, lo que implica que los resultados de todas las expresiones FP-estrictos deben ser los predichos por IEEE 754 aritmética sobre operandos representado usando solo y formatos dobles. Dentro de una expresión que no es FP-estricto, un margen de maniobra se concede por una aplicación para utilizar una gama extendida exponente para representar los resultados intermedios; el efecto neto, en términos generales, es que un cálculo podría producir "la respuesta correcta" en situaciones donde el uso exclusivo del valor flotante o juego de doble valor podría resultar en desbordamiento positivo o negativo.

Nunca he tenido personalmente un uso para él, sin embargo.

Como las otras respuestas mencionaron que causar que los resultados de punto flotante intermedios para conformarse a la especificación IEEE. En particular, los procesadores x86 pueden almacenar resultados intermedios con precisión diferente de la especificación IEEE. La situación se vuelve más complicada cuando el JIT optimiza un cálculo determinado; el orden de las instrucciones puede ser diferente cada vez resulta en ligeramente diferente redondeo.

La sobrecarga producida por strictfp probable que sea muy procesador y JIT dependiente. En este artículo de Wikipedia sobre SSE2 parece tener alguna información sobre el problema. Así que si el JIT puede generar instrucciones SSE para realizar un cálculo parece que strictfp no tendrá ningún tipo de gastos.

En mi proyecto actual hay algunos lugares en los que utilizo strictfp. Hay un punto en el que los rayos cósmicos potenciales deben ser retirados de valores de píxeles. Si algún investigador externo tiene el mismo valor de píxel y los rayos cósmicos en ellos delante que debe recibir el mismo valor resultante como nuestro software.

  • strictfp es un modificador que restringe cálculos de punto flotante según IEEE 754.

  • Esto puede ser usado en toda la clase como "strictfp pública StrictFpModifierExample clase {}" o sobre el método "strictfp pública ejemplo void ()". Si se utiliza la clase de todos los métodos seguirá IEEE 754 y si se usa en el método a continuación método particular seguirá IEEE 754.

  • ¿Por qué se utiliza ?? ::: Como diferentes plataformas tienen diferente hardware de punto flotante que calcula con más precisión y una mayor gama de valores que la especificación Java requiere que puede producir una salida diffrent en diffrent plateforms.so confirma la misma salida con independencia de plateforms diffrent

  • strictfp también se asegura de tomar ventaja de la velocidad y la precisión de las operaciones de punto flotante de precisión del extendido.

  • No hay ninguna desventaja con esta palabra clave se puede utilizar cuando estamos haciendo cálculos de punto flotante

  • Mi último punto es --¿Qué es IEEE754 en resumen IEEE 754 define método estándar para ambos cálculos de punto flotante y el almacenamiento de valores de coma flotante en cualquiera individual (de 32 bits, usado en Java flota) o doble (64 bits, usado en Java dobles) precision.It también define normas para los cálculos intermedios y para los formatos de mayor precisión.

strictfp es una palabra clave y se pueden usar como un modificador no no el acceso para las clases o unos métodos (pero nunca variables). Marcado de una clase como <=> significa que cualquier código de método en la clase se ajustará a las normas IEEE 754 estándar para puntos flotantes.

Sin que modificador, puntos flotantes utilizadas en los métodos podrían comportarse de una manera dependiente de la plataforma. Con él se puede predecir cómo se comportarán sus puntos flotantes, independientemente de la plataforma subyacente de la JVM está ejecutando. La desventaja es que si la plataforma subyacente es capaz de soportar una mayor precisión, un método <=> no será capaz de tomar ventaja de ello.

Si no se declara una clase como <=>, puede todavía conseguir <=> comportamiento en un método por método, al declarar un método como <=>.

~ SCJP Sun®Certified programador para Java ™ 6 - Kathy Sierra y Bert Bates ~

mayo ejemplo a continuación ayuda para entender esto más claro: En Java cada vez que estamos utilizando en busca de información precisa para cualquier operación, por ejemplo,             si hacemos doble num1 = 10e + 102; doble num2 = 8e + 10;                 resultado = num1 + num2;

        The output will be so long and not precise, becasue it is precissed by the hardware e.g JVM and JIT has the license 
        as long as we dont have specify it Strictfp

Marking it Strictfp will make the result Uniform on every hardware and platform, because its precised value will be same
One scenario I can see is in a distributed application (or multiplayer game) where all floating-point calculations need to 
be deterministic no matter what the underlying hardware or CPU is.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top