FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
No sé, pero recordé una ocasión en la que pedí que no me hablaran de Firebird cuando abordé un caso relacionado con InterBase, y no faltó quien lo hizo. Acaso la solución era migrar todo un sistema con miles de líneas de código fuente y una implementación de base de datos que usaba y explotaba características propias de InterBase? Quiero decir con esto, y volviendo al tema, que creo las respuestas no son del todo apropiadas ya que no abordan el tema tal y como está planteado, razón por la cual voy a intentar explicarlo de otra manera, para lo cual parto nuevamente desde el comienzo:
La sentencia:
, si la probamos en todas las instalaciones de Firebird y equipos que queramos, nos debe dar como resultado 1, cierto? Veamos: el número 8.99 tiene su forma binaria tanto en 32 bits como en 64 bits (la podemos ver aquí: http://www-2.dc.uba.ar/materias/oc1/...at_conver.html) Si voy a la representación binaria de precisión simple (32 bits) y luego hago la conversión nuevamente a punto flotante obtengo el número: 8.9899998 Si voy a la representación binaria de precisión doble (64 bits) y luego hago la conversión nuevamente a punto flotante obtengo el número: 8.99 Son diferentes, por supuesto. Ahora, si observamos nuevamente la consulta la pregunta es: aún esperamos 1 como resultado? Yo diría que sí, o acaso 8.99 no es igual a 8.99? Aún haciendo uso del CAST en el segundo. Pero no nos apresuremos... Obviamente Firebird hará internamente las conversiones del caso para poder comparar los números expresados en forma binaria (o hexadecimal). Entonces, si supongo que el CAST obliga a Firebird a expresar el 8.99 con precisión doble (de 64 bits), qué pasa con el primer 8.99, que no tiene CAST? Se expresará como un dato de punto flotante con precisión simple? Firebird lo "elevará" y expresará como un dato de punto flotante de precisión doble, dado el tipo de dato del número al lado derecho en la expresión condicional? Antes de continuar, quiero recordar que la exposición del tema se debe a que, al ejecutar la consulta de este post en "mil computadores" ... obtengo un 1 como resultado, menos en uno de ellos. Qué sucede en ese equipo? Ahora, si a esto le sumamos el hecho de que el sistema en cuestión viene funcionando hace más de 10 años y que se trata de un sistema robusto, en producción, usado por muchos clientes que nunca han tenido problemas en este sentido, la solución obviamente no es morirse cambiando los tipos de datos DOUBLE PRECISION a NUMERIC, salvo que todas las plataformas del mundo hubiesen "mutado" misteriosamente y de repente todo funcionara mal (hago la salvedad de que esto sí podría ser posible si alguna actualización del sistema nos quisiera hacer pasar un mal rato).
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre. Última edición por mlara fecha: 29-04-2014 a las 16:46:45. |
#2
|
||||
|
||||
Es que no tiene nada que ver con firebird o interbase. Es igual en todos los sistemas.
|
#3
|
||||
|
||||
A veces cuando quiero hablar de si las cosas son o no son me voy a la taberna... Casimiro, de qué se trata esto? Yo expongo un caso que me parece interesante discutir. Podría plantear las cosas de otra manera, podría preguntar de qué manera Firebird hace las conversiones, y luego las comparaciones? De qué depende? Y no todos los sistemas o los lenguajes o sistemas las hacen igual, pero no quiero desviarme del tema. Al final sólo creo que el tema podría tratarse de verdad, un poco en profundidad.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre. Última edición por mlara fecha: 29-04-2014 a las 17:42:28. |
#4
|
||||
|
||||
egostar, yo diría que no tiene nada qué ver con el procesador. Aún así en el primer post de este hilo expuse las características del equipo en el que sucede.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre. |
#5
|
||||
|
||||
Puede que si:
http://randomascii.wordpress.com/201...-compare-them/ Mas detalles en: http://randomascii.wordpress.com/201...int-precision/ En resumen: Cita:
Tambien ahi estaba: Cita:
En el momento que hay un float, no esperes resultados predecibles si cambias de compilador, CPU o arquitectura, a menos que uses una libreria que de esas garantias. Por ejemplo en: http://gafferongames.com/networking-...t-determinism/ Cita:
---- Es divertido saber que los aspectos fundamentales de la programación son así de confiables
__________________
El malabarista. Última edición por mamcx fecha: 29-04-2014 a las 18:11:21. |
#6
|
||||
|
||||
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código Únete al grupo Teaming clubdelphi | Colabora mediante Paypal Última edición por Casimiro Notevi fecha: 29-04-2014 a las 19:17:28. |
#7
|
||||
|
||||
Es que me ocurrió lo mismo que a ti. Cientos de clientes (por no decir miles ), después de muchísimos años, sin problemas. Y un día un cliente tiene un problema extraño, no le "cuadraban" unos datos que a todo el mundo le funcionaba bien. Siguiendo paso a paso nos encontramos con que la comparación con valores double no se hacía correctamente en según qué circunstancias. La solución es sencillamente cambiar double por numeric.
En nuestro caso fue fácil porque siempre he usado dominios para declarar los campos de las tablas, así que solamente se tuvo que cambiar la declaración de algunos dominios y no hubo que tocar los campos. |
#8
|
|||
|
|||
Cita:
Digo a este punto cualquier cuestión es válida. Saludos
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
tipo de dato | arnedokpo | Conexión con bases de datos | 1 | 14-07-2008 16:37:06 |
Tipo de dato | nelem | Internet | 4 | 15-01-2008 16:46:06 |
Tipo de Dato | BetoAlonso | Varios | 11 | 09-12-2007 00:30:01 |
Caso Raro de Decimales en campo de tipo Flotante | AGAG4 | Conexión con bases de datos | 5 | 21-02-2007 18:27:46 |
ayuda con numeros de tipo flotante | vero_17jm | SQL | 3 | 07-12-2006 14:06:51 |
|