Articulo de referencia

fp estricto

strictfp es una palabra reservada obsoleta y redundante en el lenguaje de programación Java . [ 1 ] [ 2 ] Anteriormente, esta palabra clave se usaba como un modificador que rest...

strictfp es una palabra reservada obsoleta y redundante en el lenguaje de programación Java . [ 1 ] [ 2 ] Anteriormente, esta palabra clave se usaba como un modificador que restringía los cálculos de punto flotante a la semántica IEEE 754 para garantizar la portabilidad. La palabra clave strictfp se introdujo en Java con la versión 1.2 de la máquina virtual Java (JVM) y su funcionalidad se eliminó en la versión 17 de la JVM. [ 2 ] A partir de Java 17, se requiere la semántica IEEE 754, por lo que el uso de esta palabra clave no tiene efecto.

Base

La norma IEEE 754 especifica un método estándar tanto para cálculos de punto flotante como para el almacenamiento de valores de punto flotante en varios formatos, incluyendo precisión simple (32 bits, utilizada en Java float) o doble (64 bits, utilizada en Java double).

Algunos equipos también ofrecen formatos de precisión extendida que proporcionan mayor precisión y/o un rango de exponentes más amplio. En estas arquitecturas, puede resultar más eficiente calcular los resultados intermedios utilizando dichos formatos. Esto puede evitar errores de redondeo , desbordamientos y subdesbordamientos que de otro modo ocurrirían, pero puede provocar que los programas generen resultados diferentes en estas arquitecturas. Resultaba especialmente costoso evitar el uso de precisión extendida en máquinas x86 con la arquitectura de punto flotante x87 tradicional . Si bien era fácil controlar la precisión del cálculo, limitar el rango de exponentes para los resultados intermedios requería instrucciones adicionales costosas.

Antes de la JVM 1.2, los cálculos de punto flotante debían ser estrictos; es decir, todos los resultados intermedios de punto flotante debían comportarse como si se representaran utilizando precisión simple o doble IEEE. Esto hacía que, en el hardware común basado en x87, resultara costoso garantizar que se produjeran desbordamientos cuando fuera necesario.

A partir de la JVM 1.2, por defecto, se permitía que los cálculos intermedios superaran los rangos de exponentes estándar asociados a los formatos IEEE de 32 y 64 bits. En su lugar, se permitía representarlos como miembros del conjunto de valores de "exponente extendido". En plataformas como x87, los desbordamientos y subdesbordamientos podían ocurrir donde se esperaba, lo que producía resultados posiblemente más significativos, pero menos repetibles.

Dado que el punto flotante x87 ya no es necesario en los procesadores x86 que admiten SSE2 , Java 17 volvió a hacer estrictas todas las operaciones de punto flotante, restaurando efectivamente la semántica anterior a la versión 1.2. [ 2 ]

Cómo funciona

En ausencia de desbordamiento o subdesbordamiento, no hay diferencia en los resultados con o sin strictfp. Si la repetibilidad es esencial, se puede usar el modificador strictfp para asegurar que el desbordamiento y el subdesbordamiento ocurran en los mismos lugares en todas las plataformas. Sin el modificador strictfp, los resultados intermedios pueden usar un rango de exponente mayor. [ 3 ]

El strictfpmodificador logra esto al representar todos los valores intermedios como valores de precisión simple y doble IEEE, como ocurría en versiones anteriores de la JVM. [ 4 ]

Uso

Los programadores pueden usar el modificador strictfppara garantizar que los cálculos se realicen como en las versiones anteriores; es decir, solo con tipos de precisión simple y doble IEEE. El uso de strictfp garantiza que los resultados de los cálculos de punto flotante sean idénticos en todas las plataformas.

Se puede utilizar en clases , interfaces y métodos no abstractos . [ 5 ] Cuando se aplica a un método, hace que todos los cálculos dentro del método utilicen aritmética de punto flotante estricta. Cuando se aplica a una clase, todos los cálculos dentro de la clase utilizan aritmética de punto flotante estricta. Las expresiones constantes en tiempo de compilación siempre deben utilizar un comportamiento de punto flotante estricto. [ 6 ]

Ejemplos

public strictfp class MyFPclass { // ... contenido de la clase aquí ... }

Referencias

  1. "Especificación del lenguaje Java - Capítulo 3. Estructura léxica" .
  2. 1 2 3 "JEP 306: Restaurar la semántica de punto flotante siempre estricta" .
  3. Gosling, James; Joy, Bill; Steele, Guy L. Jr.; Bracha, Gilad; Buckley, Alex; Smith, Daniel (2017). "4.2.3 Tipos, formatos y valores de punto flotante". Especificación del lenguaje Java, Java SE 9. Addison-Wesley Professional . Consultado el 6 de octubre de 2017 .
  4. Flanagan, David (marzo de 2005). Java en pocas palabras (quinta ed.). O'Reilly Media . ISBN  978-0-596-00773-7. Consultado el 3 de marzo de 2010 .
  5. Schildt, Herbert (2007). Java: Guía para principiantes (4.ª ed.). McGraw-Hill Companies. ISBN  978-0-07-226384-8.
  6. Gosling, James; Joy, Bill; Steele, Guy L. Jr.; Bracha, Gilad (2005). "15.4 Expresiones FP-strict". Especificación del lenguaje Java, tercera edición . Addison-Wesley Professional. pág. 411. ISBN  0-321-24678-0. Consultado el 22 de marzo de 2016 .
Obtenido de " https://en.wikipedia.org/w/index.php?title=Strictfp&oldid=1359646773 "