Tag : Java

Curiosidades en operaciones de punto flotante

¿Qué pasa si restas?

9999999999999999.0 – 9999999999999998.0 = ?

El resultado depende un poco del lenguaje.   En la mayoría de los casos el resultado será 2.

Esta es la pregunta que se hizo Geo Carncross y hace el experimento con varios lenguajes de programación.


Seguramente lo habrás aprendido en la escuela, pero es un aspecto de la programación que suele olvidarse con frecuencia.



La razón tiene que ver más con la forma en la que se almacenan valores decimales en la memoria que con la operación misma.   En el caso de Java por ejemplo, un valor de punto flotante de doble precisión como el tipo double es un valor de 64 bits, donde:

1 bit denota el signo (positivo o negativo).
11 bits para el exponente.
52 bits para los dígitos significativos (la parte fraccionaria como un binario) .

Estas partes se combinan para producir un valor decimal double.

De este modo cuando realizas la resta, realmente estás haciendo la operación sobre valores diferentes de los que especificaste durante la edición del código.

package com.decodigo;

/**
 *
 * @author decodigo.com
 */
public class Prueba {
    
    public static void main(String args[]){
        double a = 9999999999999999.0;
        double b = 9999999999999998.0;        
        double resultado = a - b;
        System.out.println("a: " + a);
        System.out.println("b: " + b);
        System.out.println("resultado: " + resultado);
    }
}

El resultado en consola será:

a: 1.0E16
b: 9.999999999999998E15
resultado: 2.0

Un número decimal no se representa exactamente en la memoria, aunque en apariencia tengan incluso el mismo número de dígitos mientras estás escribiendo el código.  Cuando el copilador convierte los valores de a y b a un número de coma flotante, sus valores se aproximan para ser representados internamente en formato binario y se complementan con el exponente si se excede la capacidad de los dígitos significativos.

Adicionalmente, cuantas más operaciones se realicen con un número de punto flotante, mayor será el número de errores de redondeo.


Netbeans – Accesos directos

En NetBeans existen algunos atajos que facilitan la escritura de codigo, aquí te mencionamos algunos.

Para dar formato o manipular código están las siguientes combinaciones:

Alt-Shift-F Da formato al código seleccionado o a todo el código si no hay selección.

Ctrl-Shift-Up/Down Copia lineas de código hacía arriba o hacia abajo.



Alt-Insert Genera código dependiendo de las posibilidades desplegando un menú de opciones.


Ctrl-Shift-I Agrega las sentencias de importación de clases que hagan falta.
Alt-Shift-I Arregla la importación de clases seleccionada.
Alt-Shift Left/Right/Up/Down Mueve la línea de código en la dirección de las teclas.
Ctrl-Shift-R Selecciona código de forma rectangular.

Ctrl-Shift-C Agrega dobles diagonales para comentarios de una sola línea.

Ctrl-E Borra la línea en la que está posicionada el cursor.

 

Prueba escribiendo de forma suscesiva los siguientes caracteres:

ifelse y a continuación la tecla Tab, NetBeans completará un bloque if con su else:

        if (true) {
            
        } else {
        }

trycatch y a continuación la tecla Tab, NetBeans completará un bloque try-catch:

        try {
            
        } catch (Exception e) {
        }

for y a continuación la tecla Tab obtienes un bloque de código para for listo para usarse:

        for (int i = 0; i < 10; i++) {
            
        }

Con el ciclo for hay más sopresas:

forst y a continuación Tab, crea el ciclo sobre un StringTokenizer:

        for (StringTokenizer stringTokenizer = new StringTokenizer(STRING); stringTokenizer.hasMoreTokens();) {
            String token = stringTokenizer.nextToken();
            
        }

forc y a continuación Tab, crea el ciclo sobre un Iterator:

        for (Iterator iterator = col.iterator(); iterator.hasNext();) {
            Object next = iterator.next();
            
        }

fore y a continuación Tab, crea el ciclo sobre un arreglo sin uso de índices:

        for (String arg : args) {
            
        }

fori y a continuación Tab, crea el ciclo sobre un arreglo con índice:

        for (int i = 0; i < arr.length; i++) {
            Object object = arr[i];
            
        }

forl y a continuación Tab, crea el ciclo sobre un objeto Array:

        for (int i = 0; i < lst.size(); i++) {
            Object get = lst.get(i);
            
        }

forv y a continuación Tab, crea el ciclo sobre un objeto Vector:

        for (int i = 0; i < vct.size(); i++) {
            Object elementAt = vct.elementAt(i);
            
        }

Para while, prueba con “whileit“, “whilen“, and “whilexp

Si no conocías estos atajos esperamos que te sean de utilidad.


Un diagrama casi completo de las Redes Neuronales

Existe una amplia variedad de tipos de redes neuronales y a veces es necesario un mapa para navegar entre muchas arquitecturas y enfoques emergentes.  Fjodor Van Veen del instituto Asimov compiló una maravillosa variedad de topologías de redes neuronales.

Mas info:www.asimovinstitute.org



Ese detalle…

¿Que otra cosa puede ser más perfecta para regalar?

Java Básico, el ciclo for, continue y break


Pregunta Java


Pregunta Java

Tip: No se ofrece ninguna garantía en cuanto a la orden de iteración de la serie; en particular, no garantiza que la orden permanecerá constante en el tiempo. Esta clase permite el elemento nulo.


Pregunta Java


Pregunta Java

Tip: Al momento de deserializar, no se crea una instancia nueva del objeto serializable. 
Entonces el constructor de la clase hijo no es llamado.

Lo que no es Java

“Java != javascript”