Autor Tema: Programa que encuentre logaritmos en lenguaje C

0 Usuarios y 1 Visitante están viendo este tema.

12 Septiembre, 2008, 07:31 pm
Leído 5478 veces

eduar

  • $$\Large \color{#5372a0}\pi\,\pi$$
  • Mensajes: 65
  • Karma: +0/-0
  • Sexo: Masculino
Hola a todos, estoy haciendo un algoritmo que encuentre logaritmos en base 10 sin ultilizar la funcion log(x)que ofrece C pero e  encontrado muchas dificultades por la inexactitud que este me ofrece para ciertos numero, como los primo o numeros que tengan un factor primo mayor que 1000 (esto es por el diseño que le di al programa)
mirenlo
int i,x;
      double long y,s;
      cout<<"\nEscriba numero para hallar el logaritmo: ";
      cin>>x;
      s=0;
      
      {for (i=2;i<=x;i++)
         {
         while (x%i==0)
           {
            x=x/i;
            if(i==2){y=0.301029995;}
            else if(i==3){y=0.477121254;}
            else if(i==5){y=0.698970004;}
            else if(i==7){y=0.84509804;}
            else if(i==11){y=1.041392685;}
            else if(i==13){y=1.113943352;}
            else if(i==17){y=1.230448921;}
            else if(i==19){y=1.278753601;}
            else if(i==23){y=1.361728;}
            else if(i==29){y=1.462398;}
            else if(i==31){y=1.491362;}
            else if(i==37){y=1.568202;}
            else if(i==41){y=1.612784;}
            else if(i==43){y=1.633468;}
            else if(i==47){y=1.672098;}
            else if(i==53){y=1.724276;}
            else if(i==59){y=1.770852;}
            else if(i==61){y=1.785330;}
            else if(i==67){y=1.826075;}
            else if(i==71){y=1.851258;}
            else if(i==73){y=1.863323;}
            else if(i==79){y=1.897627;}
            else if(i==83){y=1.919078;}
            else if(i==89){y=1.949390;}
                else if(i==97){y=1.986771;}
            else if (i>100 && i<150){y=2.081104;}
            else if (i>150 && i<250){y=2.290804;}
                else if (i>250 && i<350){y=2.472723;}
            else if (i>350 && i<450){y=2.6037215;}
                else if (i>450 && i<550){y=2.623033;}
            else if (i>550 && i<650){y=2.77775;}
                else if (i>650 && i<750){y=2.84327;}
            else if (i>750 && i<850){y=2.90101;}
            else if (i>850 && i<950){y=2.9523;}
                else if (i>950 && i<1000){y=2.98985;}
            else {int n,m,c;
      n=0;
      m=1;
       while (m<=i){m=m*10;
                   n=n+1;
                          }
                   c=n-1;
            y=c;}
            s=s+y;
           }
         }
      
        }
   getch();
}

lo que el hace es que descompone el numero en sus factores primos y busca cada factor en la tabla de logaritmo que inserte, pero como se daran cuenta es muy obsoleto el colocar  especialmente por que a los numeros primos mayores que 1000 solo les halla la parte entera del logaritmo.
Agradeceria sugerencias u otras opciones para seguir diseñandolo o tambien metodos para encontrar logaritmo.

Gracias

12 Septiembre, 2008, 08:56 pm
Respuesta #1

leonardo09

  • Leonardo Andrés Jofré Flor
  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 786
  • Karma: +0/-0
  • Sexo: Masculino
  • Leonardo Jofré
    • Leonardo Andrés Jofré Flor
Otra cosa:

Los numero primos son infinitos, asi que es una forma muy poco elegante hacer if-else infinitas veces, te que profundices mas y hagas el desarrollo en serie de la función \( \log_{10}(x) \) para luego darle la exactitud que quieras con un while
nunca seré buen matemático

12 Septiembre, 2008, 09:11 pm
Respuesta #2

eduar

  • $$\Large \color{#5372a0}\pi\,\pi$$
  • Mensajes: 65
  • Karma: +0/-0
  • Sexo: Masculino
Hola gracias por esa idea alguna cosa les pregunto si no puedo hacer lo de la serie de taylor

13 Septiembre, 2008, 01:13 am
Respuesta #3

eduar

  • $$\Large \color{#5372a0}\pi\,\pi$$
  • Mensajes: 65
  • Karma: +0/-0
  • Sexo: Masculino
Hola, he encontrado este link (www.unizar.es/analisis_matematico/analisis1/apuntes/09-seriespotencias.pdf ) que me da una serie de Taylor para el logaritmo base 10 de 1+x para
-1<x<1, pero no me es del todo confiable. Podrían remitirme por favor a una fuente confiable que me muestre la respectiva serie de Taylor para el log. Gracias de antemano, saludos.

13 Septiembre, 2008, 10:29 am
Respuesta #4

Luis Fuentes

  • el_manco
  • Administrador
  • Mensajes: 58,907
  • País: es
  • Karma: +0/-0
Hola

 ¿Por qué no te fías?.

 La serie para el logaritmo neperiano es:

\(  Ln(1+x)=\displaystyle\sum_{i=1}^n{}\dfrac{(-1)^{n-1}x^n}{n} \)

 Para el logaritmo en base \( 10 \), utiliza que:

\(  Log_{10}(x)=\dfrac{Ln(x)}{Ln(10)} \)

Saludos.

13 Septiembre, 2008, 04:16 pm
Respuesta #5

eduar

  • $$\Large \color{#5372a0}\pi\,\pi$$
  • Mensajes: 65
  • Karma: +0/-0
  • Sexo: Masculino
Hola gracias por la recomendaciones aqui les envio ya el algoritmo terminado desarrollado por serie de taylor(el_manco no me fiaba porque segun esa pagina habia una serie que de una me decia el logaritmo base 10 y es Ln)

double long n,x,m,v,p,s,c,i,k,a;
      double long b,y,o,u,q,z,h,j,w;
      cout<<"\nEscriba numero para hallar el logaritmo: ";
      cin>>n;
      cout<<"\nEscriba la base: ";
      cin>>b;
      m=0;
      a=0;
      k=2.302585093;
      if(n==1){cout<<"\n0";}
      else {do {n=n/10;m=m+1;a=a+k;} while ( n>=2);
      if (n<1){x=n-1;}
      else if (n>1){x=n-1;}
      else {x=0;}
      v=pow( 10,m);
      s=0;
      i=1;
      while(i<1000){
      p=pow((-1) ,(i+1)) ;
      c=pow( x,i) ;
      s=s+ (p*c/i);
      i=i+1;
      }
      o=0;
      w=0;
      do {b=b/10;o=o+1;w=w+k;} while ( b>=2);
      if (b<1){y=b-1;}
      else if (b>1){y=b-1;}
      else {y=0;}
      u=pow( 10,o);
      z=0;
      j=1;
      while(j<1000){
      q=pow((-1) ,(j+1)) ;
      h=pow( y,j) ;
      z=z+ (q*h/j);
      j=j+1;
      }
      cout<<"\n"<<(s+a)/(z+w);
      }
            getch();
                           }

Gracias :)

13 Septiembre, 2008, 11:20 pm
Respuesta #6

leonardo09

  • Leonardo Andrés Jofré Flor
  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 786
  • Karma: +0/-0
  • Sexo: Masculino
  • Leonardo Jofré
    • Leonardo Andrés Jofré Flor
en ves de tanto if-else usa switch
en un software si no vas a usar comentarios la programación estructurada va a dar el camino para entender el software.

te recomiendo que bajes de internet el libro "Como programar en C/C++" de Deitel & Deitel
nunca seré buen matemático