Blog

Cálculos de coma flotante

Numeros binariosActualmente Velneo V7 tiene un funcionamiento en cuanto a números  de coma flotante que es importante que todos los desarrolladores conozcamos.  En este FAQ intentamos explicar el funcionamiento de los cálculos de coma flotante y cómo funcionará en próximas versiones.

¿Cómo maneja Velneo V7 los números con decimales?

Velneo V7 usa C++ en toda su estructura, a su vez tanto C como C++ usa la representación binaria de números de coma flotante bajo el estándar IEEE 754-1985

La representación binaria es la más efectiva respecto a rendimiento y es la usada por la mayoría de los lenguajes de programación.

¿Este tipo de representación binaria de números de coma flotante tiene algún problema?

Lo más habitual en el uso común de los números de coma flotante en aplicaciones empresariales es usar la base 10, para el tipo de representación binaria existen números que por mucha precisión que tenga, no puede representarlos exactamente, con lo que puede existir una desviación en un decimal en una posición extrema (ej. 0.0000000000000001).

¿Puede dar problemas el uso de la representación binaria?

Los ordenadores y los procesadores trabajan en binario, con lo que trabajar con números de coma flotante en representación con sistema binario es realmente mucho más rápido y ocupa menos memoria. La mayoría de las operaciones se realizan a nivel hardware.
El estándar IEEE 754-1985 marca el uso de los números de coma flotante con representación binaria.

¿Cómo se puede solventar?

Por el momento, basta con usar un decimal más en los campos a la hora de guardar los datos, y usar la función de redondeo cuando queramos mostrar los datos al usuario. Con esta simple operación garantizamos la correcta visualización de estos números.
Por otro lado, Velneo V7 en su versión 7.3 (Estará disponible a finales del mes de Febrero de 2010) usará la representación con sistema decimal bajo la actualización del estándar IEEE_754-2008. Existen soluciones alternativas,  sin embargo hemos optado por la implementación bajo el estándar para ofrecer mejor compatibilidad en el futuro con distintos sistemas operativos y hardware.

¿Por qué no se ha realizado antes?

Muchos lenguajes de programación sólo contemplan la representación en sistema binario y es el desarrollador quien puede solucionar el problema por software de una manera sencilla.

Hasta las versiones anteriores de Velneo nos hemos centrado en las funcionalidades básicas y diferenciales de la plataforma. Conociendo que la implementación de una representación decimal puede facilitar la tarea al desarrollador en la versión 7.3 aparecerá esta funcionalidad de forma nativa.
Debemos recordar que Velneo V7 tiene que dar solución para todos los sistemas operativos actuales y futuros con lo que ofrecer una solución global complica la implementación.

La implementación de la representación en sistema decimal se lleva desarrollando durante meses para conseguir el máximo rendimiento. En este área esta teniendo una participación directa nuestro arquitecto Juan Muñoz-Cobos consciente de que el rendimiento en este tipo de operaciones es básico para toda la plataforma.

Pero, ¿otros lenguajes tienen el mismo funcionamiento?

Esta peculiaridad en el uso de números de coma flotante viene directamente del uso de los números en el procesador, con lo que cada lenguaje puede aportar o no aportar una solución.

Este error en la representación de los números decimales se refiere a que algunas  fracciones decimales no se pueden representar exactamente como fracciones binarias (de base 2). Ésta es la principal razón de que Python, Perl, C, C++, Java, Fortran y muchos otros no suelan presentar el número decimal exacto.

En esta web sobre python tienen una buena explicación técnica del problema muy fácil de entender.

En este otro enlace de Microsoft, se explican las consideraciones en el uso de números de coma flotante en sus productos.

Si quieres ampliar la información sobre la aritmética de coma flotante, recomendamos este documento de Sun Microsystems.

Otros lenguajes necesitan hacer uso de librerías externas para implementar otro tipo de dato con representación decimal.
Ruby – http://ruby-decimal.rubyforge.org/
C    – http://speleotrove.com/decimal/decnumber.html

¿Cómo maneja Velneo 6.x los números decimales?

Para Velneo 6.x se realizaron unas mejoras sobre el estándar IEEE 754-1985 que permite operar sin problemas de precisión de cálculo hasta un número limitado de decimales. Esta modificación se hizo en la versión 4.0.
La implementación realizada para Velneo 6.x no se vio adecuada para Velneo V7 ya que se ha querido mejorar el rendimiento y adaptarnos a un estándar de cara al futuro,  además de que era necesario que fuera funcional en todas las plataformas y sistemas operativos.

21 thoughts on “Cálculos de coma flotante

  1. Hola. Como era de suponer, el problema del redondeo no era por un ‘mal hacer’ o ‘capricho’ del equipo de Velneo, es conveniente estar bien informado antes de emitir una crítica, pero por otro lado, este es un tema muy peliagudo y sensible, gracias por la explicación y la próxima resolución.

  2. Decepcionante V7 hasta el momento. Es obvio que todo programador con experiencia sabe que no debe usar números en coma flotante para representar una cantidad precisa. Esto es esencial en la creación de aplicaciones empresariales, en las que Velneo afirma ser la mejor plataforma de desarrollo/despliegue. En V6 no existía ese problema (al menos yo nunca he tenido un problema con decimales).
    Y que trates de «suavizarlo» insinuando que otras tecnologías tienen el mismo problema al manejar números con decimales, es una tontería. Nunca en una aplicación Java que maneje cantidades exactas (como en una aplicación contable, por ejemplo) usarías el tipo básico float o double (a menos que quieras tener el problema que actualmente tiene V7). Usarías BigDecimal, que está hecho para manejar esas situaciones. Que V7 no maneje desde el principio número decimales exactos es una vergüenza para la «mejor» plataforma para aplicaciones empresariales.
    Además, la explicación de que «primero lo hicimos rápido, luego lo hacemos confiable», va contra toda buena práctica de programación. Que para que el sistema se «sintiera» más rápido primero implementas IEEE 754-1985, y entonces te acuerdas que para los desarrolladores de aplicaciones empresariales es una necesidad manejar cantidades precisas, y es hasta ese momento que le das atención, me parece una tontería.
     Un saludo,

  3. Pues cuando se es negativo se es negativo, ni hablar.
    P.D. Si algo no me gusta pues simplemente lo dejo de usar, amarga el corazón y la mente el perder tiempo (a menos que me pagen o sea mi negocio, claro) observando, buscando todas las cosas negativas de algó, a menos que sea para construir y mejorar, lo cual no veo en tu comentario Luis. Yo mejor me dedicaba a crecer con algo que me beneficie en lugar de hundirme con algo que no me gusta.
    Saludos.

  4. Hola aztecmexico. Lamento que me ataques a mí, y no a mis argumentos con razonamientos técnicos. He leído otros comentarios que has hecho en los foros y tu blog, y sé que tienes la competencia técnica para contra-argumentar sin caer en el prejuicio a un desconocido. Insinúas que me pagan por hacer una crítica. No, no es así. Dices que me estoy amargando; yo podría decir que eres un iluso o un «fanboy» de Velneo, pero no me atrevería a juzgar a alguien que no conozco, y de quien he leído interesantes comentarios técnicos.
     
    La crítica va contra esa política actual de Velneo de «primero lo hago rápido, y luego lo hago confiable» que se deja entrever en el post. ¿Te imaginas si en Microsoft hubieran tomado decisiones basados en esa premisa para el desarrollo de Excel? Ya veo a los ingenieros de Excel razonando: «al contador le importará más que sus sumas salgan rápidamente, aunque tenga unos pequeños errores en en los centavos». Precisión y velocidad son deseables, pero en el caso de aplicaciones empresariales, yo creo que si hay que elegir entre los dos, todos nos quedamos con la precisión.
     
    Y, vamos, no es algo nuevo. Recuerdo que cuando aprendí ensamblador para procesadores 8086, ya existían rutinas de bajo nivel para manejar BCD, lo que permitía realizar operaciones aritméticas precisas. Por supuesto, para V7 existen los retos de la multi-plataforma, pero es tan esencial manejar números precisos que debió ser de lo primero en planearse. ¿Habrá overhead por usar un formato numérico Decimal en lugar de uno de coma flotante? ¡Claro! Ocurre en Java, por ejemplo, con BigDecimal. Pero de nuevo, la precisión es clave en este negocio. Los números en coma flotante son buenos para cálculos de vértices en ambientes tridimensionales, por ejemplo, pero no para aplicaciones empresariales. A mí me parece que esta es una crítica constructiva.
     
    Lo siento, pero me uno a aquellos que dicen que V7 aun parece en estado beta, no de producción. V6 es la ley.
     
    Un saludo,
     
    P.D. Quizá quieras agregar a tu fe de erratas: algó. Imagino que querías decir: algo.

  5. Hola Luis,
    Antes que nada quiero expresarte que en el momento que escribí mi comentario no pasó por mi mente ni mi ser el realizar un ataque a la persona ni mucho menos.
    Simplemente aún y cuando comparto tu punto de vista respecto a los razonamientos técnicos que expresas no estoy de acuerdo en la forma, eso es todo (y tienes razón, ahi me ganó el apasionamiento de un, como bien dices fanboy de velneo).
    Existen muchas maneras de expresar nuestro sentir y todas con válidad, pero los resultados de cada una pueden llegar a ser diametralmente opuestos.
    Muchas veces hay que perder para ganar, de hecho es parte de la negociación en los grandes proyectos.
    Mencionas el ejemplo del desarrollo de Excel por parte de Microsoft, tienes razón, pero no mencionas el resto de sus productos, cuantos dolores de cabeza dan, huecos por todos lados, clientes y usuarios al borde de infartos, etc. etc. etc.
    Mis espectativas respecto a V7 son altas, aunque como acertadamente mencionas por el momento V6 es la ley, de acuerdo, pero en el ámbito de negocios en el que me desenvuelvo V6 no me permite atacar los proyectos (por tamaño, recursos y precios) que deseo y que se presentan a diario, imaginate, son proyectos de muchos millones de euros (y mucho más en devaluados pesos mexicanos).
    Mi experiencia con las grandes herramientas no ha sido la mejor, te puedo asegurar (no comprobar porque no me lo dieron por escrito) que por ejemplo la Base de Datos más utilizada y de las más caras en licenciamiento (su dueño tiene uno de los super yates más grandes del mundo) tiene bastantes defectos que afectan mis instalaciones y mi relación con mis clientes de manera significativa, y dicha empresa no hace nada tangible por resolverlo, porque «ya viene la nueva versión», la cual incorpora la solucioón a esos miles de bugs, lo que no dicen y me consta es que ellos mismos pueblan las versiones de ciertas «fallas» porque de lo contrario se les acaba el negocio.
    Espero que no sea esa la optica de desarrollo de V7, sacar versiones a producción con fallos perfectamente detectados y retrasar la salida de versiones que corrijan esos fallos con el único afan de cobrar por mantenimientos y asesorías. En el momento que detecte que esas son sun intenciones (aunque digan otra cosa), yo sería el primero en abandonar este barco, aún con el dolor y la molestia de haber desperdiciado tanto tiempo esperando «el santo grial» de Velneo. Sé que no será asi, o cuando menos eso espero.
    En fin, esto es el pan de cada día, y te reitero mi profundo respeto por tus comentarios y sobre todo por tu persona, quizas los mismos comentarios pero con otro enfoque ayuden más a los señores de Velneo a corregir el rumbo, a no sacar por sacar o por presión, ya nos hemos esperado bastante por la V7, yo en lo personal estoy dispuesto a esperar un poco más y tener el producto que todos deseamos y esperamos, que sea confiable, estable y que nos de los gustos y satisfacciones que hemos obtenido con V6 y más.
    Cordialmente.

  6. Hola
    Creo que no debemos mezclar temas, este hilo habla de los decimales en v7 y comentarios como este merecen ser contestados (sin acritud)
     
    «V6 no me permite atacar los proyectos (por tamaño, recursos y precios) que deseo y que se presentan a diario, imaginate, son proyectos de muchos millones de euros (y mucho más en devaluados pesos mexicanos).»
     
    ¿Tamaño?: V6 es la base más rápida del mercado.
    ¿Recursos?: V6 consume muy pocos recursos… y además suele dividir bien.
    ¿Precios?: V6 es más económica que v7 (monopuestos)
     
    Claro, estamos hablando de proyectos de millones de euros, por cierto los  casos de éxito que conozco que se presentan en la web de velneo (v7) están hechos en v6 por grandes empresas que no han tenido problemas ni de tamaño ni de recursos ni de precios.  Me gustaria saber qué proyecto de millones de euros se está haciendo con v7, por curiosidad.
     
    Que quede claro, V6 está muy bien hecho, las aplicaciones de gestión empresarial se desarrollan super-rápido y nuestros productos en v6 funcionan de maravilla.
     
    Un abrazo.
     
     
     
     
     
     
     
     
     

  7. Precisamente, por el momento cuando menos yo, ningún proyecto a producción con v7, concuerdo contigo en que V6 es la leche, pero cuando hablo de recursos me refiero a que mi posible cliente requiere que al menos 7000 usuarios accedan concurrentemente a una aplicación, situación que por más que pregunté en su momento nadie me dio indicios de alguna aplicación siquiera con 1000 usuarios concurrentes, máximo 400 o 500,  además de que no me permite resolver algunas cuestiones «técnicas» de todos (quizás no todos) conocidas.
    Por lo demás los pocos proyectos en v6 que he tenido oportunidad de crear van y funcionan excelentemente, sin problemas, pero como en alguna ocasión me comentaron en Velneo, V6 tiene ciertos alcances, y esta diseñado para cierto tipo de aplicaciones y necesidades de acceso.
    No pretendo ni he pretendido nunca utilizarlo para lo que no esta diseñado y jamás emitiría una crítica al respecto.
    Es lo mejor que me ha ocurrido.
    En fín, reciban todos un cordial saludo y sigamos críticando constructivamente la V7 en aras de que el producto final que salga a producción cumpla nuestras espectativas.
     
    Off.

  8. Quiere usted decir que va a utilizar en un proyecto de semejante envergadura (7000 usuarios concurrentes) una herramienta con innumerables bugs y que repito por enésima vez está en versión Beta (por mucho que nos quieran vender la moto), espero que sus clientes no lean este foro, porque yo automáticamente le descartaría para llevarlo a cabo, y no es un ataque personal, ni mucho menos, pero es que a veces se leen cosas en este foro que me dejan perplejo, creo que todos deseamos que Velneo tenga éxito con su nueva herramienta de desarrollo y estamos de acuerdo que va a ser mejor que la V6, o al menos eso creemos, pero todavía no está al nivel requerido para poder comercializar las aplicaciones desarrolladas con dicha plataforma.Por otra parte no comprendo esta actitud tan conformista de la mayoría de esta comunidad:

    Comercial.arhes2000el problema del redondeo no era por un ‘mal hacer’ o ‘capricho’ del equipo de Velneo, es conveniente estar bien informado antes de emitir una crítica.

    Pues desde mi punto de vista, en una herramienta destinada a realizar aplicaciones empresariales, ¡¡esto es un fallo garrafal!!, y pretender comercializar esta versión como un producto no Beta, sin comentarios…

  9. Hola. Sonovision… De acuerdo que lo es, pero, aunque no lo he probado, me consta que existen formas de solucionar el problema en una supuesta aplicación que se quiera poner a producir, hasta que llegue la definitiva, (espero que en Febrero), yo tampoco en este momento crearía una aplicación ‘seria’ con V7, pero que yo o tu no lo hagamos, no quiere decir nada, ¿ has visitado lo que estámn haciendo en tipesoft ? http://www.tipesoft.com/, ¿ has probado vCash de Overall ?, ¿ piensas que todos están locos ?, 🙂 es broma, pero tengamos un poco de paciencia, y mientras tanto ganemos dinero con V6.
     
    Saludos cordiales.
    Miguel.

  10. @Saludos desde Puebla MX
     Me parece que ya me adelantaron el comentario, pero bueno…   hay algo que no logro comprender muy bien y es ¿Alguien de los usuarios ”inconformes” a intentado hacer algo con la v7?  En caso de que aún no, personalmente les pediría paciencia, esperemos ver qué sucede!  Algunos se darán de topes en la pared después de que vean a otros usuarios NUEVOS en la plataforma velneo ó incluso sin conocer siquiera a su antecesora 6x,  que se nos adelantaron!   Mientras algunos se quedaron discrepando en pequeñeces, que al final se solucionan de una forma u otra.
     Esperemos que NO se nos adelanten demasiado, je je,   por lo menos un servidor ya esta desarrollando en v7, y aun que la verdad cuesta un poco (sobre todo por las odiosas comparaciones con 6x) poco a poco se va uno adaptando, como a todo en la vida…
    Ahora vemos a algunos maestros 6x, que en v7 ya no figuran…  y a maestros v7 que nunca figuraron en 6x…   no cabe duda que el cambio fue (para algunos que tuvieron la visión) una oportunidad de posicionarse como líder de una plataforma inexplorada…  a la que muchos aún le tienen temor…   ¿será que es una forma de limitar a la competencia, mientras nos da oportunidad de recuperar el tiempo perdido?
     Por lo pronto yo sí estoy desarrollando en v7 y aún no llego a los bugs mencionados y utilizados como referencia limitante de la plataforma.
    Apoyo los comentarios de Martín, un saludo a todos desde México, nos vemos en el concurso de las Open APPS. 
    Victor Martínez Cortés
    empresa@livesoftmx.com

  11. Estimado Sonovision, en ningún momento dije que voy a utilizar V7 en el proyecto en comento, porqué?, precisamente porque considero que aún no esta lo suficientemente madura.
    Y si, me atrevo siempre y a todos mis prospectos de clientes les menciono que existe una plataforma que en un futuro les brindará los mejores desarrollos, estabilidad y funcionalidad que nunca han tenido, les explico que por el momento esta herramienta esta todavía en Beta y que no la pierdan de vista porque en un futuro no muy lejano podría formar parte de las soluciones que se implanten en sus empresas, sea yo, mi empresa u otro desarrollador de V7 y hasta el momento no he tenido ningún problema con ellos, que quede claro, no he vendido ni intentado vender ningún proyecto con V7 por lo anteriormente ya bastante comentado y probado por todos.
    Tambien les doy la dirección de internet de Velneo, para que vaya leyendo, analizando los casos de éxito de V6 y lo que en teoría brindará V7 y he recibido comentarios hasta el momento favorables en cuanto a espectativas de la gran mayoría de prospectos que en un futuro pudieran tener soluciones enteramente desarrolladas con V7.
    Aclaro que Velneo no me paga un centavo por la publicidad, lo hago por convicción, fe, ilusión, sueños, confianza, etc. como queramos o quieran llamarle, ya que en mi humilde experiencia he construido lo que soy o lo poco o mucho que tengo siempre a partir de un sueño o una idea y no una sino muchas veces me han tildado de loco muchas personas, jajaja, sin embargo reitero que siempre a partir de ahi he ido avanzando o creciendo.
    Solo como comentario, hace muuuuuuuuuuuchos años en mis inicios como programador y al estar trabajando en una dependencia del gobierno Mexicano que  entre muchas otras facultades era la encargada de la gestión y administración de las comunicaciones satelitales y espectros radioelectricos en el país (por ahi de 1990) se me «ocurrió» y me puse a soñar con un «sistema» que permitiera rastrear a todos los vehículos vía satélite mediante algún dispositivo que con las personas adecuadas podiamos crear. Para no hacerlo largo, les comento que las personas con quienes «comparti» la idea me tildaron de loco, «…estas pe……o…», ¿sábes lo que cuesta rentar bandas satelitales?, ¡mejor ponte a programar que es para lo que te contratamos!, y un largo etc, etc, etc. y me convencieron de que estaba medio loco y que mi proyecto era meramente un sueño. El resto de la historia muchos deben conocerla, en américa la compañía que lanzó ese producto se llama lojack, no se en otras partes del mundo, lo que si se y me consta es que en mi país ese producto comenzó a venderse alrededor de 1995 y que algunas de las personas a quienes originalmente comente la idea tenian que ver con dicha compañía o la franquicia en México. No se y la verdad no creo haber sido el primero en tener esa idea, pero lo que aprendí es a perseguir las ideas y los sueños hasta el final, en contra de todo y de todos y es lo que intento hacer a diario, por eso confio en la gente de Velneo para que corrija y mejore V7, pero confío más en la comunidad de desarrolladores ya que en realidad es en ustedes donde he encontrado mucha luz.
    Que esta en versión Beta?, de acuerdo, nada que discutir, pero siendo constructivos veamos esto como pruebas experimentales, mientras nadie se anime a hacer algo «grande» (entendiento que todos esos pequeños o medianos proyectos actualmente en V7 forman a su vez parte de los cimientos de los futuros grandes proyectos con V7) con V7 pues su potencial va a seguir siendo mera teoria, en cambio, si se tienen los recursos, tiempo y ganas se puede intentar un desarrollo paralelo de un gran proyecto con V7, a manera de evaluar lo que en teoría debe funcionar y, en su momento reportar a nuestros amigos de Velneo los hallazgos que procuren mejoras y ajustes a V7.
    Que quede claro, V7 tiene mucho que mejorar «antes» de salir realmente al mercado para poder soportar todo lo que en teoría debe ofrecer, mientras tanto la mejor opción es V6 siempre y cuando no queramos utilizarla para proyectos para los que no esta diseñada.
    Las grandes obras comienzan asi, con pruebas, con errores, con fallos y siempre existen dos ópticas al respecto: que todo va a salir mal, o que todo va a salir bien, y ambas son correctas, cual gana depende de los equipos y las personas que trabajan en ellas, si quieren y su foco es que se cumplan las promesas y las espectativas todo funciona, si no pues se dedican a otra cosa.
    Apuesto por el futuro de V7, pero tambien tengo un plan B, no dudaré en abandonar V7 y migrar en la búsqueda de algo mejor si V7 no llega a cumplir el mínimo de espectativas que actualmente tengo respecto a ella.
    Saludos a todos y agradezco todos los comentarios vertidos en este tópico, el cual sin querer se ha desviado del tema original, siempre aprendo cosas nuevas al leer y conocer otros puntos de vista, sobre todo de aquellos con los que no estoy de acuerdo ya que me mueven a repensar, investigar y evaluar si realmente estoy en lo que considero correcto o si es tiempo de hacer algún cambio.
    Estimado Fernando, el día de ayer aprendí una nueva palabra, «acritud», perfectamente empleada en tu comentario, creeme que de inmediato investigué su significado. Como siempre todos los días se aprende algo nuevo.
    Abrazo a toda la comunidad y los mejores deseos de éxito y prosperidad.

  12. @velneadores
    ¿No usais aún v7? – Perdeis el tiempo
    ¿No te atreves a poner alguna aplicación en producción? – Yo de momento no he tenido problemas que no haya podido solventar
    ¿No sabes redondear el contenido de  un campo sobre otro? – Pues mira, no lo hagas
    ¿No te funciona v7 como tu quisieras? – !!¿¿Qué haces perdiendo el tiempo aquí??!!
    Usa los recursos que tienes y no pienses en los que vendrán.
    v6 no es v7, no comparemos más 
     

  13. @velavisual
    Una pregunta: al decir «redondear el contenido de un campo sobre otro», ¿te refieres a crear un campo calculado para redondear por cada campo numérico en las tablas? Ya te quiero ver haciéndolo en una aplicación mediana con cientos de campos de tipo numérico.
    No quieres que hagamos comparaciones entre V6 y V7, pero son perféctamente comparables. No estamos comparando un caballo y una impresora. V6 y V7 son plataformas para aplicaciones empresariales. Van dirigidos al mismo mercado. Es más, son de la misma compañía, que ha intentado vender V7 como la evolución natural de V6.
    Las comparaciones y las críticas, cuando son bien fundamentadas, ayudan a tomar la dirección correcta. Es parte de la sana competencia que hace que los usuarios finales recibamos mejores productos. Y, si ocurre en toda la industria, ¿porque no aplicarla para dos productos dirigidos al mismo público que sean de la misma empresa?
    Saludos,

  14. Mira velavisual, si a ti te invitan a una degustación de marisco, y te sirven merluza en palitos, y lo solucionas mojando en la sopa de marisco de el de al lado , luego pagas a precio de marisco y te quedas tan ancho, pues allá tú. La V7 está bien para ir aprendiendo, si  tu quieres crear una aplicación para venderla y después ir corrigiendo tus propios parches para solventar los bugs de la herramienta con la que desarrollas, pues por mi perfecto, pero esa no es mi idea de trabajo.

Dejar un comentario