18/02/2020, 04:18:25 *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias: ¡Atención! Hay que poner la matemática con LaTeX, y se hace así (clic aquí):
 
 
Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: Tabular función en lenguaje C  (Leído 14661 veces)
0 Usuarios y 1 Visitante están viendo este tema.
leonardo09
Leonardo Andrés Jofré Flor
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Chile Chile

Mensajes: 798

Leonardo Jofré


Ver Perfil WWW
« : 24/06/2008, 19:33:00 »

estoy tabulando la función [texx]\displaystyle\frac{2}{2-x}[/texx]
en C con el siguiente codigo:

#include <stdio.h>
#include <conio.h>
main ()
{
     float x,y,z;
     x=-2;
     z=0.1;
     printf("   x|y\n");
     printf ("----+-----\n");
     do
     {
          if (x==2)
         
          printf("%4.1f|?\n",x);
         
          else
          {
         
          y=2/(2-x);
          printf("%4.1f|%5.2f\n",x,y);
          }
          x=x+z;
          }
         
          while (x<=4);
     
     getchar();}

y funciona solamente cuando [texx]z=0.5k \mbox{ con } k \mbox{entero}[/texx]¿Cuál es la razon que las indeterminaciones solo se vean con esa condición ¿cuál es el error del código?
En línea

nunca seré buen matemático
Luis Fuentes
el_manco
Administrador
Pleno*
*****

Karma: +0/-0
Conectado Conectado

Sexo: Masculino
España España

Mensajes: 45.967


Ver Perfil
« Respuesta #1 : 25/06/2008, 06:37:24 »

Hola

 ¿A qué te refieres con que "funcione o no"?. ¿Qué ocurre exactamente si le das otros valores a [texx]z[/texx]?.

Saludos.
En línea
leonardo09
Leonardo Andrés Jofré Flor
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Chile Chile

Mensajes: 798

Leonardo Jofré


Ver Perfil WWW
« Respuesta #2 : 25/06/2008, 17:27:34 »

como ves , [texx]z[/texx] se va sumando a [texx]x[/texx] en cada iteración , cuando [texx]z=0.5,1,1.5[/texx] , por eso me dice el programa "step" para cada iteración en el tabulado , pero , mira intenta conpilar cuando [texx]z=0.1[/texx]
entoncers en el tabulado cuando [texx]x=2[/texx] , o sea donde se indetermina la funcion ,  no te da el caracter [texx]?[/texx] que significa la indeterminación en el programa.
En línea

nunca seré buen matemático
Luis Fuentes
el_manco
Administrador
Pleno*
*****

Karma: +0/-0
Conectado Conectado

Sexo: Masculino
España España

Mensajes: 45.967


Ver Perfil
« Respuesta #3 : 25/06/2008, 17:52:49 »

Hola

 Ah. Ya entiendo.

 El problema está en que el ordenador sólo puede almacenar una cantidad finita de cifras decimales y eso hace que aparezcan errores de redondeo que se hacen mayores cuantas más operaciones acumulamos.

 Por eso en general para número en coma flotante las "igualdades" funcionan muy mal y es mejor para detectar si un número es igual a otro, cotejar más bien que está suficientemente cerca, es decir, sustituir:

 x==2

 por

 abs(x-2)<=0.0000001
 
 por ejemplo.

 Ten en cuenta además que el ordenador trabaja en sistema binario. Mientras que 0.5 en sistema binario sigue siendo un número con una cantidad finita de decimales; 0.1 al pasarlo a binario nos da un número con infinitas cifras decimales. De ahí que con el primer paso te funcione y con el segundo no, porque [texx]x[/texx] nunca llega a ser exactamente [texx]2[/texx].

 En general la fracción reducida [texx]n/m[/texx] puede representarse en binario con un número finito de decimales sólo si [texx]m[/texx] es una potencia de dos.

Saludos.
En línea
leonardo09
Leonardo Andrés Jofré Flor
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Chile Chile

Mensajes: 798

Leonardo Jofré


Ver Perfil WWW
« Respuesta #4 : 25/06/2008, 18:01:47 »

Y como se corrige esto??
como lo hacen las calculadoras para tabular entonces como la [texx]f_x570ES[/texx] ( ES UNA CALCULADORA )
En línea

nunca seré buen matemático
leonardo09
Leonardo Andrés Jofré Flor
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Chile Chile

Mensajes: 798

Leonardo Jofré


Ver Perfil WWW
« Respuesta #5 : 25/06/2008, 18:16:04 »

`abs' undeclared (first use this function)
¿En que librería está?
En línea

nunca seré buen matemático
Luis Fuentes
el_manco
Administrador
Pleno*
*****

Karma: +0/-0
Conectado Conectado

Sexo: Masculino
España España

Mensajes: 45.967


Ver Perfil
« Respuesta #6 : 26/06/2008, 03:59:31 »

Hola

Cita
Y como se corrige esto??
como lo hacen las calculadoras para tabular entonces como la [texx]f_x570ES[/texx]  ( ES UNA CALCULADORA )

Pues la calculadora directamene le daría valores a [texx]x[/texx] y calcularía [texx]2/(2-x)[/texx]. Si el denominador es cero o muy pequño al "intentar" hacer la división le dará un número "demasiado grande", con lo cual detecta un error de OVERFLOW, que puede ser gestionado de mil maneras dependiendo de como la hayan programado: ignorarlo no representando ese punto, dando un mensaje de error, dándole el valor simbólico infinito, etcétera...

En realidad tu programa funciona. Simplemente como [texx]x[/texx] nunca (para ciertos pasos) vale exactamente [texx]2[/texx] pues no pone ese símbolito "?", pero si te calcula la imagen de [texx]x[/texx]. Si [texx]x[/texx] es muy próximo a [texx]2[/texx] te da un valor muy grande.

La función abs está en stdlib.h

Saludos.
En línea
leonardo09
Leonardo Andrés Jofré Flor
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Chile Chile

Mensajes: 798

Leonardo Jofré


Ver Perfil WWW
« Respuesta #7 : 26/06/2008, 04:16:44 »

mira (o miren fuera mejor) , esta si que está extraña:
en un programa que tabula [texx]\displaystyle\frac{2x^2-1}{x^3-6x^2+11x-1}[/texx]
Código:
#include <stdio.h>
#include <stdlib.h>

#include <conio.h>

main ()
{
     float y;
     float x,z;
     float a,b,g;
     
     
     printf("punto inicial:");
     scanf("%f",&a);
     printf("punto final:");
     scanf("%f",&b);
     printf("step?:\n");
     scanf("%f",&z);
     x=a;
     printf("   x|y   |g\n");
     printf ("----+-----\n");
     do
     {
            g=(x*x*x-6*x*x+11*x-1);
          if (g==0)
         
          printf("%4.1f|ERROR\n|",x/10);
         
          else
          {
         
          y=(2*x*x-1)/(x*x*x-6*x*x+11*x-1);
          printf("%4.1f|%5.10f\n|",x,y);
          }
         
         x=x+z;
          ;
          }
         
          while (x<=b);
     
     getche();
     }
se ve claramente que la funcion es de la forma [texx]\displaystyle\frac{f(x)}{g(x)}[/texx] y se ve con rojo que me diera error cuando [texx]g(x)=0[/texx] o sea el denominadr fuese [texx]0[/texx] pero me tira el indeterminado cuando [texx]x=2[/texx] que no esta ni cerca de ser indeterminado. ¿Por qué será?
En línea

nunca seré buen matemático
leonardo09
Leonardo Andrés Jofré Flor
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Chile Chile

Mensajes: 798

Leonardo Jofré


Ver Perfil WWW
« Respuesta #8 : 26/06/2008, 04:19:11 »

Voy a poner el codigo aca por que en la versión código queda ilegible

#include <stdio.h>
#include <stdlib.h>

#include <conio.h>

main ()
{
     float y;
     float x,z;
     float a,b,g;
     
     
     printf("punto inicial:");
     scanf("%f",&a);
     printf("punto final:");
     scanf("%f",&b);
     printf("step?:\n");
     scanf("%f",&z);
     x=a;
     printf("   x|y   |g\n");
     printf ("----+-----\n");
     do
     {
            g=(x*x*x-6*x*x+11*x-1);
          if (g==0)
         
          printf("%4.1f|ERROR\n|",x/10);

         
          else
          {
         
          y=(2*x*x-1)/(x*x*x-6*x*x+11*x-1);
          printf("%4.1f|%5.10f\n|",x,y);
          }
         
         x=x+z;
          ;
          }
         
          while (x<=b);
     
     getche();
     }
En línea

nunca seré buen matemático
Luis Fuentes
el_manco
Administrador
Pleno*
*****

Karma: +0/-0
Conectado Conectado

Sexo: Masculino
España España

Mensajes: 45.967


Ver Perfil
« Respuesta #9 : 26/06/2008, 06:02:23 »

Hola

 ¿Con qué datos de entrada estás probando? A mi me va perfectamente y no me da indeterminado en [texx]x=2[/texx].

Saludos.
En línea
leonardo09
Leonardo Andrés Jofré Flor
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Chile Chile

Mensajes: 798

Leonardo Jofré


Ver Perfil WWW
« Respuesta #10 : 01/07/2008, 14:39:04 »

Observa , el manco , con este mismo programa , una pregunta :¿Que compilador tienes?

* algoritmo.JPG (9.77 KB - descargado 579 veces.)
En línea

nunca seré buen matemático
Luis Fuentes
el_manco
Administrador
Pleno*
*****

Karma: +0/-0
Conectado Conectado

Sexo: Masculino
España España

Mensajes: 45.967


Ver Perfil
« Respuesta #11 : 01/07/2008, 14:46:31 »

Hola

 Mi compilador es el:

Bloodshed Dev C++

 Pero fíjate que la tabla de valores no corresponde, más alla del ERROR, en ningún punto a tu función. Revisa bien tu programa. Yo simplemente hice un copy pega de lo que pusiste en tu mensaje y me funciona perfectamente.

 Revisa bien!!!!

Saludos.
En línea
leonardo09
Leonardo Andrés Jofré Flor
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Chile Chile

Mensajes: 798

Leonardo Jofré


Ver Perfil WWW
« Respuesta #12 : 01/07/2008, 14:52:36 »

yo tambien hice un copi y pega....
este lenguaje es muy caprichoso¡¡¡¡
En línea

nunca seré buen matemático
Luis Fuentes
el_manco
Administrador
Pleno*
*****

Karma: +0/-0
Conectado Conectado

Sexo: Masculino
España España

Mensajes: 45.967


Ver Perfil
« Respuesta #13 : 01/07/2008, 14:57:11 »

Hola

 Tiene que haber algo, los números de tu tabla no tienen sentido.

 Prueba a modificar la función y. Por ejemplo poniendo un valor constante o luego algo lineal. Cosas muy simples, triviales. Así se detectan los errores.

Saludos.
En línea
Daniel
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Ecuador Ecuador

Mensajes: 151


Ver Perfil WWW
« Respuesta #14 : 15/07/2008, 03:21:04 »

creo que este es un problema de multiplicación de flotante por constante entera. Muerte a los lenguajes tipeados estáticamente:

http://en.wikipedia.org/wiki/Programming_language#Typed_versus_untyped_languages
En línea

Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.4 | SMF © 2006, Simple Machines LLC XHTML 1.0 válido! CSS válido!