Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-07-2008
Avatar de juanmdq
juanmdq juanmdq is offline
Miembro
 
Registrado: dic 2004
Posts: 52
Poder: 20
juanmdq Va por buen camino
Angry Presición Imprecisa

Hola, escribo porque desde hace un tiempo tengo unos problemillas con delphi comparando valores con presición. Ej: comparo 72.49 = 72.49, ambos double, y no siempre me da que son iguales. Varia de acuerdo a como voy calculando los números, por lo general se mama cuando sumo dos listas y luego comparo sus totales.

Buscando encontre este ejemplo de mala praxis de Delphi:

Código:
var a, b, c: double;
begin
   a := 0;
   b := 0.01;
   c := 0;
   while c < 1000000 do
   begin
      a := a + b;
      c := c + 1
   end;
   writeln(a);
end;
Alguien tiene idea de como se puede solucionar este inconveniente ?
__________________
Al infierno se llega por atajos.
Responder Con Cita
  #2  
Antiguo 17-07-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por juanmdq Ver Mensaje
Hola, escribo porque desde hace un tiempo tengo unos problemillas con delphi comparando valores con presición. Ej: comparo 72.49 = 72.49, ambos double, y no siempre me da que son iguales. Varia de acuerdo a como voy calculando los números, por lo general se mama cuando sumo dos listas y luego comparo sus totales.

Buscando encontre este ejemplo de mala praxis de Delphi:

Código:
var a, b, c: double;
begin
   a := 0;
   b := 0.01;
   c := 0;
   while c < 1000000 do
   begin
      a := a + b;
      c := c + 1
   end;
   writeln(a);
end;
Alguien tiene idea de como se puede solucionar este inconveniente ?
Proba con la función CompareValue.

CompareValue(a,b);

Espero te sirva.

P.D. Aguante el avatar de pampita... que mujer... pensar que me la lleva puesta en la calle saliendo de un cliente en Recoleta. Creo que le deje marcado el botón de mi camisa en el pecho.

Saludos.
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal
Responder Con Cita
  #3  
Antiguo 17-07-2008
Avatar de juanmdq
juanmdq juanmdq is offline
Miembro
 
Registrado: dic 2004
Posts: 52
Poder: 20
juanmdq Va por buen camino
Ok. Pruebo, yo lo habia solucionado el problema utilizando la funcion RoundTo(num, dec).

Lo que en realidad queria averiguar es si existe un parche para Delphi o alguna directiva para solucionar este problema, porque el programa es grande y no quiero tener que revisar y modificar todo el código.

Gracias por la respuesta !
__________________
Al infierno se llega por atajos.
Responder Con Cita
  #4  
Antiguo 17-07-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por juanmdq Ver Mensaje
Ok. Pruebo, yo lo habia solucionado el problema utilizando la funcion RoundTo(num, dec).

Lo que en realidad queria averiguar es si existe un parche para Delphi o alguna directiva para solucionar este problema, porque el programa es grande y no quiero tener que revisar y modificar todo el código.

Gracias por la respuesta !
Es que no es un bug. Mira, por lo que comentas vos podes ver en el debuger un valor, ejemplo 2,39 pero internamente ese valor puede ser 2,3900000000001. Luego comparas y da diferente.

En mio opinión la solución de roundto no es solución dado que le estas quitando definición al dato, ejemplo para seguir el mismo caso, si era 2,3900000000001 se convierte en 2,39. Segun para que lo uses eso te va a fectar la resolución final.

El uso de la funcion compare es lo ideal porque no afecta al dato y compara precisamente el dato completo.

Saludos.
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal
Responder Con Cita
  #5  
Antiguo 18-07-2008
Avatar de juanmdq
juanmdq juanmdq is offline
Miembro
 
Registrado: dic 2004
Posts: 52
Poder: 20
juanmdq Va por buen camino
Donald. ES UN BUG DE DELPHI.
Sino fijate en el ejemplo que puse de sumar 1000000 de veces 0.01, es imposible que me de otra cosa que no sea 10000, pero sin embargo en Delphi da cualquiera.
NO puede ser que el numero 2.39 me lo guarde como 2,3900000000001 ... este es OTRO numero, internamente lo esta representando MAL.
Cuando comparas dos numeros con igual (10 = 10) internamente el Delphi deberia llamar a compare, no yo ... PARA QUE EXISTE EL IGUAL ????

Sobre lo último que decis sobre compare tenes toda la razon...

Un abrazo.
__________________
Al infierno se llega por atajos.
Responder Con Cita
  #6  
Antiguo 18-07-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por juanmdq Ver Mensaje
Donald. ES UN BUG DE DELPHI.
Sino fijate en el ejemplo que puse de sumar 1000000 de veces 0.01, es imposible que me de otra cosa que no sea 10000, pero sin embargo en Delphi da cualquiera.
Tenes razón no le preste atención al ejemplo. Pero que te da en ese ejemplo el número final? Voy a probarlo ya mismo!

Cita:
Empezado por juanmdq Ver Mensaje
NO puede ser que el numero 2.39 me lo guarde como 2,3900000000001 ... este es OTRO numero, internamente lo esta representando MAL.
No mira, es que pense que estabas tomando el número de una base de datos, entonces en ESE CASO puede ser que veamos el número representado como 2,39 y sea el otro . se entiende?

Cita:
Empezado por juanmdq Ver Mensaje
Cuando comparas dos numeros con igual (10 = 10) internamente el Delphi deberia llamar a compare, no yo ... PARA QUE EXISTE EL IGUAL ????
Bueno hermano no te enojes! por algo lo habrán hecho, digo yo, no se.

Ya mismo investigo este tema porque no me cierra.

Estas usando D2007 o una versión anterior?

Saludos.
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal
Responder Con Cita
  #7  
Antiguo 18-07-2008
Avatar de juanmdq
juanmdq juanmdq is offline
Miembro
 
Registrado: dic 2004
Posts: 52
Poder: 20
juanmdq Va por buen camino
Jajaja... Perdon por la euforia ....

Estoy utilizando Delphi 7
__________________
Al infierno se llega por atajos.
Responder Con Cita
  #8  
Antiguo 18-07-2008
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
han probado en lugar del tipo double el tipo currency? a mi me ha funcionado muy bien para calculos,
si no me creen prueben el ejemplo, solo cambien el double por currency...

Última edición por luisgutierrezb fecha: 18-07-2008 a las 16:08:28.
Responder Con Cita
  #9  
Antiguo 18-07-2008
Avatar de juanmdq
juanmdq juanmdq is offline
Miembro
 
Registrado: dic 2004
Posts: 52
Poder: 20
juanmdq Va por buen camino
bueno Luis, aparentemente has dado en la tecla ... GRACIAS !!!!

yo habia probado con double, real, extended ... me falto ese tipo.
Igual no justifico, tendria que funcionar con todos los tipos.
__________________
Al infierno se llega por atajos.
Responder Con Cita
  #10  
Antiguo 18-07-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por juanmdq Ver Mensaje
Jajaja... Perdon por la euforia ....

Estoy utilizando Delphi 7
Amigo, mis pruebas en Delphi 7 y Delphi 2007 dieron ok, adjunto el proyecto para que saques tus conclusiones. También estan los exes, ambos, por si acaso.

Descargalo aqui.

Saludos.
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal
Responder Con Cita
  #11  
Antiguo 18-07-2008
Avatar de juanmdq
juanmdq juanmdq is offline
Miembro
 
Registrado: dic 2004
Posts: 52
Poder: 20
juanmdq Va por buen camino
Amigo Donald. Me fije en el código que me mandastes y esta bien, pero le estas haciendo una conversion al dato.
Proba de ejecutar el código que postee, tal cual, y contame.
__________________
Al infierno se llega por atajos.
Responder Con Cita
  #12  
Antiguo 18-07-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por juanmdq Ver Mensaje
Amigo Donald. Me fije en el código que me mandastes y esta bien, pero le estas haciendo una conversion al dato.
Proba de ejecutar el código que postee, tal cual, y contame.

No entiendo a que conversión te referís. Por favor modifica el código del proyecto y envíalo así lo reviso.

Saludos.
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal
Responder Con Cita
  #13  
Antiguo 18-07-2008
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
juanmdq - asi es, no es justificación pero lo bueno es que hay algo que funciona y nos saca del apuro, la verdad yo tengo AÑOS que no utilizo double, real ni esos, puro currency
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 09:04:05.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi