Precisión de un double

05/11/2003 - 14:15 por Sergio | Informe spam
Alguien sabe como hacer para que un double solo trabaje con dos decimales?
Lo necesito para comparar un double con otro dentro de un bucle incremental,
y si necesito comprobar toda la parte decimal de cada unidad el ordenador
tarda bastante en pasar de 1 a 2 en el valor de la variable, por ejemplo.
Gracias de antemano.

Preguntas similare

Leer las respuestas

#1 Javier Ariza Ayuso
06/11/2003 - 09:27 | Informe spam
Si necesitas trabajar solo con 2 decimales no deberías usar un double, ni
siquiera un float. Simplemente usa un long int multiplicado por 100... Ahora
bien, si lo que quieres decir es que quieres comparar dos doubles al final
de una serie de operaciones en las que has usado todos los decimales, es
decir, comparar los valores por ejemplo imprimiendo o con una simple
condición, simplemente imprime con dos decimales o redondea el número
multiplicado por 100 al entero y vuélvelo a dividir por 100.

Saludos.

"Sergio" escribió en el mensaje
news:%
Alguien sabe como hacer para que un double solo trabaje con dos decimales?
Lo necesito para comparar un double con otro dentro de un bucle


incremental,
y si necesito comprobar toda la parte decimal de cada unidad el ordenador
tarda bastante en pasar de 1 a 2 en el valor de la variable, por ejemplo.
Gracias de antemano.


Respuesta Responder a este mensaje
#2 Sergio
10/11/2003 - 10:52 | Informe spam
El caso es que uso una función que me devuelve un double, y esa función es
de un ocx que no controlo, es por eso por lo que tengo que trabajar con
doubles. He probado lo que me has dicho y me funciona solo si el número con
el que lo comparo no es multiplo de 3. Y no entiendo muy bien porqué.
El bucle es así:
double i;
double aux;
for (i = 0;i < limite;i = i + 0.01) {
aux = floor(i*100)/100;
if (aux == valor) {...} //valor es el double que me ha devuelto la
funcion del ocx
}
pues si i debería ser igual a por ejemplo 0.15 el valor que muestra es
0.14999999999

De todos modos gracias, ya se por donde tirar, a ver que encuentro.
Respuesta Responder a este mensaje
#3 Javier Ariza Ayuso
11/11/2003 - 08:37 | Informe spam
Es normal, hay ciertos valores, como podría ser el 0,15, que no se puede
representar en doble precisión, pero sí el 0,1499999999999 que, a pesar de
ser prácticamente igual a 0,15 no lo es teóricamente, con lo que la
condición no se cumple. En general no deberías usar sentencias condicionales
con números de coma flotante; redondea y compara enteros.

Prueba esto:

(entiendo que limite es un double en el que pretendes tener un un valor de
dos decimales; si es un entero puedes quitar el floor del segundo argumento
del for...)
int i;
for(i=0; i<floor(limite*100); i++) {
if(i == floor(valor*100)) {...}
}

en {...} debería entrar con la condición que pretendías. Nota que ahora
todas las comparaciones las haces con enteros, y ninguno con coma flotante.


Un saludo.

"Sergio" escribió en el mensaje
news:%
El caso es que uso una función que me devuelve un double, y esa función es
de un ocx que no controlo, es por eso por lo que tengo que trabajar con
doubles. He probado lo que me has dicho y me funciona solo si el número


con
el que lo comparo no es multiplo de 3. Y no entiendo muy bien porqué.
El bucle es así:
double i;
double aux;
for (i = 0;i < limite;i = i + 0.01) {
aux = floor(i*100)/100;
if (aux == valor) {...} //valor es el double que me ha devuelto la
funcion del ocx
}
pues si i debería ser igual a por ejemplo 0.15 el valor que muestra es
0.14999999999

De todos modos gracias, ya se por donde tirar, a ver que encuentro.


Respuesta Responder a este mensaje
#4 Sergio
11/11/2003 - 19:17 | Informe spam
El problema sigue siendo el mismo en los casos en el que el valor < 0.
Quiero decir valor no es nunca 0.01, sin 0.009999999
asique en los casos en los que i es 1 no entraria porque floor(valor*100)
devuelve 0
Lo he probado con "un decimal", y mas de lo mismo.

"Javier Ariza Ayuso" escribió en el
mensaje news:Fk0sb.997494$
Es normal, hay ciertos valores, como podría ser el 0,15, que no se puede
representar en doble precisión, pero sí el 0,1499999999999 que, a pesar de
ser prácticamente igual a 0,15 no lo es teóricamente, con lo que la
condición no se cumple. En general no deberías usar sentencias


condicionales
con números de coma flotante; redondea y compara enteros.

Prueba esto:

(entiendo que limite es un double en el que pretendes tener un un valor de
dos decimales; si es un entero puedes quitar el floor del segundo


argumento
del for...)
int i;
for(i=0; i<floor(limite*100); i++) {
if(i == floor(valor*100)) {...}
}

en {...} debería entrar con la condición que pretendías. Nota que ahora
todas las comparaciones las haces con enteros, y ninguno con coma


flotante.


Un saludo.

"Sergio" escribió en el mensaje
news:%
> El caso es que uso una función que me devuelve un double, y esa función


es
> de un ocx que no controlo, es por eso por lo que tengo que trabajar con
> doubles. He probado lo que me has dicho y me funciona solo si el número
con
> el que lo comparo no es multiplo de 3. Y no entiendo muy bien porqué.
> El bucle es así:
> double i;
> double aux;
> for (i = 0;i < limite;i = i + 0.01) {
> aux = floor(i*100)/100;
> if (aux == valor) {...} //valor es el double que me ha devuelto la
> funcion del ocx
> }
> pues si i debería ser igual a por ejemplo 0.15 el valor que muestra es
> 0.14999999999
>
> De todos modos gracias, ya se por donde tirar, a ver que encuentro.
>
>


Respuesta Responder a este mensaje
#5 Hernán
11/11/2003 - 19:41 | Informe spam
Si mal no recuerdo, el ieee 754 define una constante epsilon para los
fines de una comparación. Digo, si la diferencia entre dos float (o
doubles, creo que hay un epsilon para cada uno de los tipos) es menor
que la constante, entonces son "iguales"... supongo que es así como se
usa.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida