Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Presición Imprecisa (https://www.clubdelphi.com/foros/showthread.php?t=58351)

juanmdq 17-07-2008 16:36:09

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 ?

donald shimoda 17-07-2008 16:45:56

Cita:

Empezado por juanmdq (Mensaje 301052)
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. :p

Saludos.

juanmdq 17-07-2008 18:00:28

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 !

donald shimoda 17-07-2008 19:59:38

Cita:

Empezado por juanmdq (Mensaje 301100)
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.

juanmdq 18-07-2008 13:08:53

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.

donald shimoda 18-07-2008 14:48:49

Cita:

Empezado por juanmdq (Mensaje 301302)
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! :p

Cita:

Empezado por juanmdq (Mensaje 301302)
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 (Mensaje 301302)
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! :D 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.

juanmdq 18-07-2008 15:02:21

Jajaja... Perdon por la euforia ....

Estoy utilizando Delphi 7

luisgutierrezb 18-07-2008 16:04:48

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...

juanmdq 18-07-2008 16:19:42

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.

donald shimoda 18-07-2008 17:10:33

Cita:

Empezado por juanmdq (Mensaje 301324)
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.

juanmdq 18-07-2008 18:07:47

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.

donald shimoda 18-07-2008 18:58:30

Cita:

Empezado por juanmdq (Mensaje 301400)
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.

luisgutierrezb 18-07-2008 19:04:57

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


La franja horaria es GMT +2. Ahora son las 14:19:00.

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