Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Se cierra programa al aproximarse a 1

Estas en el tema de Se cierra programa al aproximarse a 1 en el foro de C/C++ en Foros del Web. Hola a todos, tengo el siguiente algoritmo y se me cierra al aproximarse a 1; el algoritmo simula una neurona que reconoce una entrada AND, ...
  #1 (permalink)  
Antiguo 16/09/2015, 18:46
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 8 meses
Puntos: 0
Exclamación Se cierra programa al aproximarse a 1

Hola a todos, tengo el siguiente algoritmo y se me cierra al aproximarse a 1; el algoritmo simula una neurona que reconoce una entrada AND, para probar el algoritmo hay que meter las entradas 1 y 1.

Código C++:
Ver original
  1. #include <iostream>
  2. #include <math.h>
  3. #include <iomanip>
  4.  
  5. using namespace std;
  6.  
  7. struct dendrita{
  8.     double peso=0.32;
  9. };
  10.  
  11. //3.368998902283415031178037679637782275676727294921875 peso
  12. //0.99883983
  13. class neurona{
  14. private:
  15.     dendrita dendritas[2];
  16.     int i1,i2;
  17.     double sum=0;
  18.     double sesgo=0.02;
  19.  
  20. public:
  21.     neurona(int i, int j){
  22.         i1=i;
  23.         i2=j;
  24.         sum=sesgo+i*dendritas[0].peso+j*dendritas[1].peso;
  25.         cout<<"sum= "<<sum;
  26.     }
  27.  
  28.     void evaluar(){
  29.         double x;
  30.         int xx;
  31.         x=1/(1+pow(2.718281828,(-1*sum)));
  32.         xx=x*10000000;
  33.         x=xx/10000000.0;
  34.  
  35.         cout<<"este es x: "<<x<<endl;
  36.  
  37.         if(x>=1.0){
  38.             cout<<"estoy excitada"<<endl;
  39.             cout<<"Peso: "<<dendritas[0].peso;
  40.         }else{
  41.             //"no estoy excitada, x= "<<
  42.             //cout<<setprecision(150)<<x<<endl<<endl<<endl<<endl;
  43.             recalcular(x);
  44.         }
  45.  
  46.     }
  47.  
  48.     void recalcular(double x){
  49.         double delta=(1-x)*0.01;
  50.  
  51.         int peso1,peso2,delt=delta*10000000;
  52.         delta=delt/10000000.0;
  53.  
  54.  
  55.         dendritas[0].peso=dendritas[0].peso+delta;
  56.         peso1=dendritas[0].peso*100000;
  57.         dendritas[0].peso=peso1/100000.0;
  58.  
  59.         dendritas[1].peso=dendritas[0].peso+delta;
  60.         peso2=dendritas[1].peso*100000;
  61.         dendritas[1].peso=peso2/100000.0;
  62.  
  63.         //cout<<"delta w: "<<setprecision(15)<<delta<<endl;
  64.         cout<<"dendritas peso: "<<dendritas[0].peso<<endl;
  65.         instanciar();
  66.     }
  67.  
  68.     void instanciar(){
  69.         int summ;
  70.         sum=sesgo+i1*dendritas[0].peso+i2*dendritas[1].peso;
  71.         summ=sum*10000000;
  72.         sum=summ/10000000.0;
  73.         cout<<"suma: "<<sum<<endl;
  74.  
  75.         evaluar();
  76.     }
  77.  
  78.     void peso(){
  79.         cout<<"peso= "<<dendritas[0].peso;
  80.     }
  81. };
  82.  
  83. int main()
  84. {
  85.     int x,i1,i2;
  86.  
  87.     cout<<"Digite entrada 1: ";
  88.     cin>>i1;
  89.     cout<<"Digite entrada 2: ";
  90.     cin>>i2;
  91.  
  92.  
  93.     neurona prueba(i1,i2);
  94.  
  95.     prueba.instanciar();
  96.  
  97.     return 0;
  98. }
  #2 (permalink)  
Antiguo 17/09/2015, 00:51
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Se cierra programa al aproximarse a 1

Tu programa tiene dos problemas:

1. la función recalcular no va a alcanzar nunca el valor 1.0. El motivo es que delta tendrá un valor proporcional a la distancia entre el valor real y 1, cuando ambos valores estén lo suficientemente próximos delta tendrá un valor inferior a la precisión de double, de tal forma que:

Código :
Ver original
  1. dendritas[0].peso=dendritas[0].peso+delta=dendritas[0].peso;
  2. dendritas[1].peso=dendritas[0].peso+delta=dendritas[0].peso;

por cierto, fíjate que dendritas[1].peso se igual a dendritas[0].peso, eso no se si es un comportamiento correcto
y esto se producirá para el resto de iteraciones.

esto se podría solucionar si admitieses como valor válido no que x>=1, sino fabs(x-1)<1e-4. De esta forma admites que, por ejemplo, 0.99991 equivale a 1.0

2. El segundo error es un fallo de diseño. Tu programa se basa en la recursividad lo cual no creo que sea lo adecuado dada la naturaleza del algoritmo que pretendes calcular... sería más lógico romper esa recursividad y sustituirla por un bucle, quizás un while sería lo más lógico.

Un saludo
  #3 (permalink)  
Antiguo 17/09/2015, 08:33
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 8 meses
Puntos: 0
Pregunta Respuesta: Se cierra programa al aproximarse a 1

Hola eferion, el valor que tiene alcanzar 1 es el valor de x que esta en la funcion evaluar, delta por el contrario tiene que alcanzar el valor de 0; si delta alcanza el valor de 0 el valor de x tendra que alcanzar el valor de 1 o superior, por eso ando multiplicando por 10000000 para que el double no se me salga del rango de precisión, la verdad no se que pasa...
Cita:
Iniciado por eferion Ver Mensaje
Tu programa tiene dos problemas:

1. la función recalcular no va a alcanzar nunca el valor 1.0. El motivo es que delta tendrá un valor proporcional a la distancia entre el valor real y 1, cuando ambos valores estén lo suficientemente próximos delta tendrá un valor inferior a la precisión de double, de tal forma que:

Código :
Ver original
  1. dendritas[0].peso=dendritas[0].peso+delta=dendritas[0].peso;
  2. dendritas[1].peso=dendritas[0].peso+delta=dendritas[0].peso;

por cierto, fíjate que dendritas[1].peso se igual a dendritas[0].peso, eso no se si es un comportamiento correcto
y esto se producirá para el resto de iteraciones.

esto se podría solucionar si admitieses como valor válido no que x>=1, sino fabs(x-1)<1e-4. De esta forma admites que, por ejemplo, 0.99991 equivale a 1.0

2. El segundo error es un fallo de diseño. Tu programa se basa en la recursividad lo cual no creo que sea lo adecuado dada la naturaleza del algoritmo que pretendes calcular... sería más lógico romper esa recursividad y sustituirla por un bucle, quizás un while sería lo más lógico.

Un saludo
  #4 (permalink)  
Antiguo 17/09/2015, 09:00
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Se cierra programa al aproximarse a 1

Pasa lo siguiente:

Imagina x=0.99999999
delta = (1-x)*0.1 = 0.000000001 (1e-9)
delt = delta*10000000 = 0 (es un int)
delta = delt/10000000.0 = 0

El resto del camino te lo puedes imaginar
  #5 (permalink)  
Antiguo 18/09/2015, 12:46
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 8 meses
Puntos: 0
Pregunta Respuesta: Se cierra programa al aproximarse a 1

Cita:
Iniciado por eferion Ver Mensaje
Pasa lo siguiente:

Imagina x=0.99999999
delta = (1-x)*0.1 = 0.000000001 (1e-9)
delt = delta*10000000 = 0 (es un int)
delta = delt/10000000.0 = 0

El resto del camino te lo puedes imaginar
Claro tienes razon; la pregunta es porque se cierra el programa en vez de quedarse en un ciclo infinito..?

Última edición por shikamarucb; 18/09/2015 a las 13:51 Razón: ortografia
  #6 (permalink)  
Antiguo 19/09/2015, 03:19
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Se cierra programa al aproximarse a 1

Porque las funciones se llaman de forma recursiva, esto es A llama B que a su vez llama a C y esta llama a A y se repite el ciclo. Cada una de estas llamadas va consumiendo la pila del programa... Hasta que la misma se llena y el programa se va al garete.

Si sustituyes la recursividad por un for evitas que la pila se llene.

Si no tienes muy claro que es el stack(pila) y el heap(memoria dinámica) ni sobre las implocaciones de la recursividad deberías consultar sobre ello en google, yo hasta al menos el lunes no voy a sacar tiempo para tratar un tema así.

Un saludo

Etiquetas: cerrar, double, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:30.