Trabajar con números de punto flotante en Java


Hay dos tipos de números que normalmente usamos para la mayoría de los propósitos en la programación: enteros y Números de punto flotante. Los enteros son números no fraccionarios que pueden ser positivos o negativos. Las operaciones de cálculo y almacenamiento realizadas sobre estos números son relativamente sencillas. Esto hace que trabajar con ellos sea rápido y eficiente y se recomienda, cuando corresponda, usarlos en todos los cálculos posibles. En Java, (según el tipo de datos), los números enteros pueden oscilar entre -9,223,372,036,854,808 a 9.223.372.036.854.807.

Mientras tanto, los números de punto flotante se pueden considerar como números de punto decimal, como 2.0 o 14.321. Tienen propiedades especiales cuando se usan en el desarrollo de aplicaciones, lo que puede ser un problema en términos de almacenamiento y operaciones. Si bien los desarrolladores pueden ignorar las complejidades de los números de punto flotante, en una situación crítica, es indispensable una buena comprensión de su funcionamiento interno, especialmente para los programadores. En este tutorial de programación, nos centraremos específicamente en los números de punto flotante y cómo usarlos de manera efectiva en el ámbito del desarrollo de software program Java.

Cómo funcionan los números en la memoria de Java

Java utiliza un sistema numérico binario para representar números. Diferentes tipos numéricos usan una cantidad diferente de bits. Supongamos que la memoria de la computadora es una matriz de 6 × 6 donde cada fila ocupa un número de un tamaño fijo. En este caso, sabemos que nuestra matriz de 6 × 6 puede almacenar un signo, más cinco dígitos decimales. Como definimos una variable o una constante, la ubicación asignada consta de cinco dígitos y un signo (+ o ). El almacenamiento de números no fraccionarios, como un número entero o una constante, es bastante sencillo, donde la primera ubicación denota el signo seguido de cinco números (en nuestro caso). Los números más grandes y más pequeños posibles son del rango: -99,999 a +99,999.

(+)(99999) – Largest +ve quantity
(+)(00000) – Zero
(-)(99999) – Largest -ve quantity

En este sentido, una cosa importante a destacar es precisiónque representa el número máximo de dígitos cada tienda de memoria puede aguantar. En nuestro caso, es de 5 dígitos, y no podemos almacenar números mayores que 99,999. Para evitar esto, hay un truco que los desarrolladores pueden aprovechar: podemos usar el dígito más a la izquierda para representar un exponente, como se muestra aquí:

(+)(9)(9999) = 9999 x10^9

Ejemplo de punto flotante de Java

Con este método de exponenciación, los programadores pueden representar un rango mucho mayor que -99,999 o +99999tal como 9,999,000,000,000 mediante +9,999,000,000,000. Sin embargo, la precisión en este caso se cut back a 4 dígitos. Si el esquema de codificación se limita a 4 dígitos significativos (en nuestro caso hipotético), entonces los cuatro dígitos más a la izquierda se representan correctamente y los dígitos más a la derecha, o los dígitos menos significativos, se pierden (se supone que son 0).

Cómo representar números de coma flotante en Java

Almacenar una variable de punto flotante o una constante no es tan easy como podría sospechar al principio; eso es porque el numero consta de una parte entera y una parte fraccionaria. La memoria almacena solo un número finito de dígitos (también llamados palabra). Un método para representar números de punto flotante es asumir una posición fija para el punto decimal y almacenar todos los números (cambiar los números de manera apropiada si es necesario) con un punto decimal asumido. En tal convención, los números máximo y mínimo (en magnitud) que se pueden almacenar son 9999.99 y 0000.01, respectivamente. El objetivo es mantener el rango máximo de valores que se pueden almacenar en este esquema. En pocas palabras, un número de punto flotante tiene dos partes: exponente y mantisa. A veces los números tienen que ser normalizado (descartando, redondeando el exceso de dígitos, and so forth.) para mantener un número cercano al número exacto dentro del rango restringido (longitud de palabra permitida). Considere el siguiente caso:

9546 x 10^-2=95.46
35 x 10^-4=.0035

Java Signo de Mantisa

Según nuestro caso hipotético, ahora podemos representar cualquier número entre 9999×10^9 y +9999×10^9. Esto es exacto a 4 dígitos significativos. Cualquier número mayor o menor que el rango se descarta o tiene resultados impredecibles si se usa en cálculos matemáticos. Por ejemplo, en este 4 dígitos significativos esquema, números como 0.2056, -6.789y 1000000 están representadas exactamentepero un número como 123.0897 no es exacta, porque tiene 7 dígitos significativos tanto en el lado izquierdo como en el derecho del lugar decimal.

Por lo tanto, normalmente se representaría como 123.0descartando otros números después del lugar decimal.

En Java, la máquina digital de Java (JVM) realiza el redondeo de números en lugar del easy truncamiento de los dígitos sobrantes. Esto no es cierto para todos los lenguajes de programación, porque hay sistemas que no hacen ningún redondeo. Entonces, en nuestro caso, si tomamos el esquema JVM, el número actual que se almacenará es 123.1 y no 123.0. En cualquier caso, se trata de una importante pérdida de precisión. El redondeo de dígitos es un intento consciente de hacer algo más incorrecto que el propio número incorrecto. Esto es essential en situaciones críticas, como en la observación científica o transacciones monetarias donde la precisión importa. El punto, sin embargo, es que en la programación de computadoras, este tipo de error es inevitable y solo puede haber una gama más amplia de valores de precisión para compensar. En algún umbral, los programadores deben descartar algunos números. Esto trae un aire de falta de confiabilidad asociado con los números de coma flotante y, como tal, es mejor evitarlos a menos que sea absolutamente necesario.

Nota: Nunca use números de coma flotante con declaraciones condicionales o bucles. El redondeo de un número es un error inevitable en números donde la precisión importa. Java tiene muchas mejores opciones disponibles para este propósito.

Operaciones aritméticas de Java y números de punto flotante

En el desarrollo de software program se realizan dos tipos de operaciones aritméticas: aritmética entera y aritmética actual o de punto flotante.

Los resultados de la aritmética de enteros son exactos, pero la aritmética de punto flotante no lo es. En esta sección nos centraremos específicamente en la aritmética de punto flotante. Como ahora sabemos que los números de coma flotante se representan en dos partes (exponente y mantisa), la suma, la resta, la multiplicación y la división se realizan de la siguiente manera. Supongamos que los números son todos números de punto flotante normalizados.

Normalización de punto flotante en Java

En Java, las mantisas se desplazan hacia la izquierda hasta que los dígitos más significativos (los dígitos más a la izquierda) sean distintos de cero. Normalización se realiza para preservar el número de dígitos útiles. Por ejemplo, el número .005678, tiene dos ceros iniciales que, si se almacenan, ocuparían un espacio innecesario. Debido a esto, debe normalizarse como .5678×10^-2.

Adición de punto flotante en Java

Cuando dos números se representan como notación de coma flotante normalizada, los exponentes de los dos números deben igualarse desplazando las mantisas adecuadamente, como se muestra en los siguientes ejemplos:

Adición de Java Mantissa

Adición de Java Mantissa

Resta de punto flotante en Java

Los principios de la resta son los mismos y no son más que sumar un número negativo.

Multiplicación de punto flotante en Java

La multiplicación de dos números de punto flotante normalizados se realiza multiplicando las mantisas y sumando el exponente. Aquí hay algunos ejemplos de normalización de multiplicación de coma flotante con mantisa en Java:

Ejemplo de multiplicación de Java Mantissa

División de punto flotante de Java

En caso de división, la mantisa del numerador se divide por la del denominador. El exponente del denominador se resta del exponente del numerador. Finalmente se normaliza el cociente obtenido. Estos son algunos ejemplos de normalización de punto flotante y división de mantisa en Java:

División de punto flotante de Java

Cómo maneja Java los números de coma flotante

Como se indicó, las computadoras usan números binarios en lugar de decimales. La concept, sin embargo, es la misma. Diferentes sistemas proporcionan diferentes magnitudes de precisión. La mayoría de los sistemas utilizan un exponente de dos dígitos para el tipo de punto flotante más pequeño y cuatro dígitos para los tipos más grandes. El dígito significativo para la mantisa puede ser 6, 15o 19 dígitos A veces depende de la compilación del compilador para decidir la magnitud. El rango y la precisión utilizados por Java, de acuerdo con la especificación del lenguaje, vienen dados por la siguiente fórmula:

S x M x 2^e

Aquí, S es cualquiera +1 o -1 dependiendo del número positivo/negativo. METRO es un entero positivo menor que 2^24 y mi denota el rango entre -126 y 127inclusive para el flotar tipos Y para doble tipos, METRO es menos que 2^53mientras que e oscila -1022 a 1023 son inclusivos. De hecho, podemos ver/imprimir el rango máximo y mínimo del valor. Clases numéricas de Java, como Entero, Flotaro Doble proporcionar constantes tales como VALOR MÁXIMO y MIN_VALUE. Aquí hay un ejemplo de código easy que muestra cómo Java maneja los valores de punto flotante:

bundle org.mano.instance;

public class Major {

	public static void major(String() args) {
		System.out.println("Minimal  integer worth: "+ Integer.MIN_VALUE);
		System.out.println("Most  integer worth: "+Integer.MAX_VALUE);
		System.out.println("Minimal  float worth: "+Float.MIN_VALUE);
		System.out.println("Most  float worth: "+Float.MAX_VALUE);
		System.out.println("Minimal  double worth: "+Double.MIN_VALUE);
		System.out.println("Most  double worth: "+Double.MAX_VALUE);
	}
}

Ejecutar este código en su entorno de desarrollo integrado (IDE) o editor de código genera el siguiente resultado:

Minimal  integer worth: -2147483648
Most  integer worth: 2147483647
Minimal  float worth: 1.4E-45
Most  float worth: 3.4028235E38
Minimal  double worth: 4.9E-324
Most  double worth: 1.7976931348623157E308

Reflexiones finales sobre los números de punto flotante de Java

Este fue un tutorial de programación rápido que cubre los conceptos detrás de los números de coma flotante y cómo Java los trata. Esperemos que aclare el motivo de la imprevisibilidad asociada con este tipo de números. Además, comprenda que las complejidades asociadas con el almacenamiento de números de coma flotante son un poco complejas, al igual que sus operaciones aritméticas.

Related Articles

JupiterOne obtiene una financiación de la serie C de $ 70 millones, logra el estado de unicornio

Se estima que el costo anual international del delito cibernético...

Comments

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Same Category

spot_img

Stay in touch!

Follow our Instagram