elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 22:34  


Tema destacado: Últimos eventos sobre seguridad/inseguridad

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Operacion con Double me falla la exactitud
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Operacion con Double me falla la exactitud  (Leído 885 veces)
xmbeat92

Desconectado Desconectado

Mensajes: 40



Ver Perfil
Operacion con Double me falla la exactitud
« en: 13 Diciembre 2011, 19:52 »

lo que pasa es que he estado buscando porque no me da exacto esto, nunca entra en la condicion, no se que debo hacer para que X me de 0.456, el resultado de X despues de esa operacion es de 0.4560000000000030695446184836328029632568359375

Código:
#include <iostream>
using namespace std;
int main(){
    double x=123.456;
    x-=123;
    if (x==0.456){cout<<"Iguales";}
    
}


En línea

El hombre encuentra a Dios detrás de cada puerta que la ciencia logra abrir. -Einstein
ApOkAlizE

Desconectado Desconectado

Mensajes: 131


¿sabes lo que vales? ¡consigue lo que te mereces!


Ver Perfil
Re: Operacion con Double me falla la exactitud
« Respuesta #1 en: 13 Diciembre 2011, 20:44 »

Juan, yo en las mates soy muy malo pero si el resultado esta bien menos en que las cifras de menor importancia son distintas pdorias provar en cojer por ejemplo solo 3 decimales y así solo comparas si es igual a 0.465 y como te darà pues ya esta, bueno nose si es exactamente eso lo que buscas.


En línea

Los virus informaticos son como las personas, hacen lo posible para destruir y hacen lo impossible para no ser destruidos... - ApOkAlizE

No nos atrevemos a muchas cosas porque son difíciles, pero son difíciles porque no nos atrevemos a hacerlas. -Seneca
xmbeat92

Desconectado Desconectado

Mensajes: 40



Ver Perfil
Re: Operacion con Double me falla la exactitud
« Respuesta #2 en: 13 Diciembre 2011, 20:53 »

no, de hecho no me ayuda en nada, lo que ando haciendo es algo como esto:

Código:
Cadena strStr(double numero){
        Cadena temp;
        long int residuo, i=10,cociente;
        char c;
        while (int(numero)!=0){
            residuo=((int)numero)%i;//123
            numero-=residuo;
            residuo/=(i/10);
            c=residuo+48;
            temp=Cadena(c)+temp;
            i*=10;
        }
        if (numero!=0){
            temp+='.';
            i=10;
            while (numero!=0){
                numero*=10;
                cociente=numero;
                residuo=cociente%10;
                c=residuo+48;
                temp+=c;
                if (numero>0) numero-=residuo;
            }
        }

        return temp;
    }

aun esta terminado para con numeros negativos, pero es aqui donde descubro que mi resultado se ve modificado por las operaciones que hago a dentro
En línea

El hombre encuentra a Dios detrás de cada puerta que la ciencia logra abrir. -Einstein
[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.507


El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: Operacion con Double me falla la exactitud
« Respuesta #3 en: 13 Diciembre 2011, 21:12 »

Es que estas restando un entero a un punto flotante... prueba con este.
Código
#include <iostream>
using namespace std;
int main(){
   double x=123.456;
   x-=123.0;
   if (*(int*)&x==0.456)cout<<"Iguales";
 
}

tambien este es valido

Código
#include <iostream>
using namespace std;
int main(){
   double x=123.456;
   x-=123f;
   if (*(int*)&x==0.456)cout<<"Iguales";
 
}
« Última modificación: 13 Diciembre 2011, 21:20 por [L]ord [R]NA » En línea

xmbeat92

Desconectado Desconectado

Mensajes: 40



Ver Perfil
Re: Operacion con Double me falla la exactitud
« Respuesta #4 en: 13 Diciembre 2011, 21:17 »

Supongo que lo probaste y te da, pero a mi no! o me equivoco, aun no entra en el if, estoy en un procesoador x86 sistema linux si es q afecta en algo pero lo dudo
En línea

El hombre encuentra a Dios detrás de cada puerta que la ciencia logra abrir. -Einstein
[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.507


El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: Operacion con Double me falla la exactitud
« Respuesta #5 en: 13 Diciembre 2011, 21:21 »

Modifique el codigo nuevamente... lo que sucede es que en los float existe un margen de error, son flotantes y dan un margen de precision, no exactitud.
En línea

xmbeat92

Desconectado Desconectado

Mensajes: 40



Ver Perfil
Re: Operacion con Double me falla la exactitud
« Respuesta #6 en: 13 Diciembre 2011, 21:28 »

ya probe el codigo nuevamente pero aun no me da la condicion, o eso es lo que me trataste de decir hace un momento??
En línea

El hombre encuentra a Dios detrás de cada puerta que la ciencia logra abrir. -Einstein
Ferno

Desconectado Desconectado

Mensajes: 282


Ver Perfil
Re: Operacion con Double me falla la exactitud
« Respuesta #7 en: 13 Diciembre 2011, 21:34 »

¿Podrías probar a truncarlo con 3 decimales significativos, no? Aunque tendrás que preocuparte por los errores de redondeo...
En línea
[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.507


El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: Operacion con Double me falla la exactitud
« Respuesta #8 en: 13 Diciembre 2011, 21:42 »

Entonces prueba colocando un margen de error... seria lo mas correcto. Como te comente, todo depende de la precision que requieras y agregar el margen de error.

Código
#include <iostream>
using namespace std;
int main(){
   double x=123.456;
   x-=123.0;
   if (x>=0.4560 && x<0.4561)cout<<"Iguales";
 
}
En línea

raul_samp

Desconectado Desconectado

Mensajes: 36



Ver Perfil
Re: Operacion con Double me falla la exactitud
« Respuesta #9 en: 13 Diciembre 2011, 21:48 »

lo que pasa es que he estado buscando porque no me da exacto esto, nunca entra en la condicion, no se que debo hacer para que X me de 0.456, el resultado de X despues de esa operacion es de 0.4560000000000030695446184836328029632568359375

Código:
#include <iostream>
using namespace std;
int main(){
    double x=123.456;
    x-=123;
    if (x==0.456){cout<<"Iguales";}
    
}

Primero el valor de x no seria el que has dicho sino que seria 0.45600000000000307 porque los doubles no tienen tanta precisión en C++ y todos los dígitos de mas que coges son *****.

Porque pasa esto pues muy fácil los valores de punto flotante generalmente no tienen una representación binaria exacta. De hecho, los diferentes compiladores y arquitecturas de CPU existentes almacenan temporalmente los resultados a diferentes precisiones, por lo que los resultados pueden depender del entorno en que trabajemos y de un montón de cosas más.

Solución también muy fácil ver que los números a comparar se aproximan en un orden de magnitud.

Por ejemplo en nuestro caso seria algo así como:

if(abs(x - 0.456) <= 1e-5)

Si quieres compararlo con un error de +- 10e-5

abs() es la función valor absoluto de la librería cmath.
En línea

Yeah Mr. White, yes science!!
xmbeat92

Desconectado Desconectado

Mensajes: 40



Ver Perfil
Re: Operacion con Double me falla la exactitud
« Respuesta #10 en: 13 Diciembre 2011, 21:55 »

El resultado lo tome de la funcion que comento arriba y tienes razon no tiene tanta exactitud, lo que pasa es que la funcion agrega lo que le dan de residuo, y como el resultado de la resta nunca dio exacta ahi un problema otro es que al multiplicar *10 si te das cuenta tampoco dio exacto lo que aun asi agrega numeros imaginarios a la derecha, es por eso que da ese extraño numero, bien tratare con otra cosa. Gracias por contestar!
En línea

El hombre encuentra a Dios detrás de cada puerta que la ciencia logra abrir. -Einstein
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
averiguar victima con exactitud
Análisis y Diseño de Malware
dreamer61es 1 451 Último mensaje 25 Marzo 2004, 17:57
por VeLeZaNO
double duda
Multimedia
0v1m 4 507 Último mensaje 27 Mayo 2007, 19:52
por 0v1m
indizacion-double
.NET
makinavaja3500 1 1,025 Último mensaje 25 Julio 2008, 04:49
por MANULOMM
Disco duro falla aleatoriamente. ¿Posible falla en el motor? :P
Hardware
Ariath 3 839 Último mensaje 23 Junio 2010, 22:05
por Aprendiz-Oscuro
Multiplicación de dos double sale 0
Programación C/C++
Kasswed 1 1,065 Último mensaje 26 Mayo 2011, 17:59
por Mr.Blue
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines