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.


Tips para programadores

Aprende un nuevo lenguaje

Es sabido que no debes enfocarte en una sola tecnología o lenguaje de programación.   Pero el sentido de este consejo no es sólo que escojas una tecnología que te permita ganar más dinero (que también es una buena idea), sino que además de eso te permita experimentar y hacer cosas diferentes. Por ejemplo, si siempre has estado enfocado a aplicaciones WEB, puedes comenzar a experimentar con el control de motores eléctricos o para obtener datos desde sensores o hardware que no hayas usado anteriormente, o probar también con aplicaciones para móviles, tendrás una perspectiva más amplia de lo que es el desarrollo de software.


Ten un  “Pet Project”

Todos tenemos ideas para una aplicación o desarrollo que nos gustaría programar.  Sin embargo pocas veces las materializamos.  Esto no sólo es malo porque pierdes la oportunidad de llevar a cabo una buena idea, sino que también es posible que nunca sepas si esa idea es mala o que en realidad no sea tan útil, o peor aún, que ya exista algo parecido porque no habías investigado demasiado y te enfoques mejor en otra cosa.  Adquiere el hábito de tener al menos un proyecto y ve agregando características poco a poco pero de forma constante.

Relaciónate con personas que hagan cosas diferentes

No sólo se trata de encontrar gente que use otras tecnologías, sino otras formas de hacer negocios y de ganar dinero.  Es posible que encuentres oportunidades donde otros no las han visto, tan sólo porque no ha llegado nadie para propornerlas.  No te enfoques sólo a entender los problemas de los clientes de la empresa donde trabajes.

Haz que tu trabajo se vea elegante

Son muchos los desarrolladores que descuidan el aspecto visual de su trabajo y sólo se preocupan porque funcione correctamente.  Sin embargo una apariencia visual o usabilidad deficientes, pueden hacer que el usuario tenga una impresión equivocada sobre como funcionan tus desarrollos y llegue a pensar que tiene errores aún cuando esto no sea verdad, recuerda que haces desarrollo para facilitarle la vida a personas que no siempre tienen un conocimiento técnico silimar al tuyo.

No inventes cosas que ya están bien hechas

Lenguajes como Java o C# no son los más ampliamente usados por su sintaxis o su facilidad de uso, sino por la inmensa variedad de librerías o herramientas que existen y que puedes usar libremente, con la seguridad de que van a funcionar correctamente. No gastes tu tiempo tratndo de hacer algo que ya existe si no lo vas a superar.

Comparte y acepta críticas a tu código

Es universal. Ocurre en todas las profesiones. A nadie le gusta que le digan como hacer cosas que uno supone hace bien.  Pero compartir ideas y tomar en cuenta las recomendaciones de otros es casi tan útil como Google para aprender cosas nuevas.  Además mejoras tu ambiente laboral.

Crea librerías de ejemplos o soluciones

No es que tengas que desarrollar librerías nuevas, se trata más bien de esos ejemplos, como conectarte a bases de datos, nombres de drivers, herramientas, comandos, funciones o técnicas de desarrollo que quizá aplicarás en tus proyectos más de una vez. En cualquier momento puedes usar el buscador y encontrar prácticamente todo lo que necesites, pero tener cosas ya probadas previamente por tí, es muy útil.

Descansa lejos de la computadora

Esto debes hacerlo por puro amor propio y no sólo es descansar, ejercítate.  Algunos problemas de espalda y ojos derivados de pasar horas sentados frente a la computadora pueden agravarse y son difíciles de tratar.  Cuida tu cuerpo.

 


Una de las mejores presentaciones de Machine Learning

El empleado de Google Jason Mayes, ingeniero creativo senior, ha publicado unas de las mejores presentaciones sobre Machine Learning. El trabajo es el resultado de dos años de experiencia, es gratuito y se puede descargar o visualizar en línea. Los únicos requisitos según su creador son los siguientes:

  • Dos horas de estudio y atención continuas.
  • Cerrar clientes de correo y aplicaciones de mensajería.
  • Buscar un lugar adecuado para su estudio, porque no por nada se trata del estudio de “deep learning”.
  • Leer más de una vez las letras en negritas.

El único inconveniente, está en inglés, pero es más o menos fácil de entender.
El enlace directo: https://docs.google.com/presentation/



La presentación de Google Duplex en la Google I/O

La gran novedad en uno de los eventos más importantes de Google, la 2018 I/O Developer Conference es Google Duplex, el asistente que hará las reservaciones por ti.

Durante la presentación, el asistente realiza dos reservaciones con establecimientos reales.  El asistente, la “persona no real” interactúa con una “persona real”, que parece no percatarse nunca que está conversando con una inteligencia artificial.




Una de las cosas más sorprendentes es la velocidad de respuesta y la entonación bastante natural del asistente.  Es un poco gracioso el momento en que el asistente usa la expresión “Mm hmm”, que no es que sea particularmente difícil de “decir”, sino que ha escogido el momento preciso y hace la conversación más familiar, cosa que no ocurre regularmente con otras IAs.

Otro aspecto interesante (en la reservación al restaurante), es que aunque parece haber una confusión entre el número de personas que asistirán y la fecha en que debe realizarse la reservación, el dialogo y el arreglo terminan más o menos bien, lo cual no es cualquier cosa para una IA.

Google ha dicho que la función se lanzará como un experimento en las próximas semanas.


Linus Torvals, la mente detrás de Linux

Linus Torvalds transformó la tecnología dos veces: primero con el núcleo de Linux, que es uno de los soportes fundamentales de Internet, y lo hizo nuevamente con Git, el sistema de administración de código fuente utilizado por desarrolladores de todo el mundo. En una rara entrevista con el Curador de TED, Chris Anderson, Torvalds discute con gran apertura los rasgos de personalidad que impulsaron su filosofía de trabajo, su ingeniería y su vida.

Puedes activar los subtítulos en español.

 

 



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



Oracle moverá Java EE a la Fundación Eclipse

Oracle anuncia que junto con IBM y Red Hat, moverá Java EE a la Fundación Eclipse.  David Delabassee, evangelista de software de Oracle comenta en su blog:

“Nos hemos acercado a IBM y Red Hat, los otros mayores contribuyentes a la plataforma Java EE, para solicitar su apoyo a esta nueva dirección. Oracle, IBM y Red Hat están colaborando continuamente para refinar un enfoque en el que podamos colaborar colectivamente”

https://blogs.oracle.com/


El mapa de la ciencia de la computación

Dominic Walliman ha creado un interesante poster sobre la Ciencia de la Computación.  El poster es una genialidad que resume gráficamente una amplia variedad de temas como los Algoritmos, Lógica, Complejidad, Machine Learning, la mítica Máquina de Turing, Inteligencia Artificial, Realidad Aumentada y muchos otros de los temas que esta nueva ciencia abarca y en la cual es posible profundizar tanto como en cualquier otra ciencia.

El poster siempre va acompañado de un video donde explica con mayor detalle cada uno de los temas plasmados en la imagen.  No olvides cambiar los subtitulos al español.




Otros mapas igualmente interesantes.

Física
Física

Matemáticas
Matemáticas

Puedes ir directamente a la imagen en este link: https://www.flickr.com

O comprar su poster: https://www.redbubble.com


Pruebas