SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: Lomko en Jueves 29 de Julio de 2010, 09:02

Título: Funcion de error, erf(X)
Publicado por: Lomko en Jueves 29 de Julio de 2010, 09:02
Hola a todos,

soy un novato en la programación y es que no se como arreglar el problema que tengo.
Estoy programando en Visual Studio 2008 en c++. Quiero utilizar la función de error, erf(x) o erfc(x). He visto por la red que añadiendo el encabezado math.h (he probado poner #include "math.h" y #include <math.h>) el problema estaría solucionado ya que estaría ahí incluido. Me pasó lo mismo con anterioridad para el exponencial, exp(x), y el logaritmo, log(x). Pero resulta que ahora al utilizar erf(x) no funciona (y con el logaritmo y exponencial no tuve ningún problema). Al compilar me da el error C3861 y me dice que no se ha encontrado el identificador. ¿Puede alguien ayudarme en saber qué pasa y comó arreglarlo? #include "stdafx.h" también está incluido en el código.

gracias y un saludo
Título: Re: Funcion de error, erf(X)
Publicado por: Amilius en Viernes 30 de Julio de 2010, 01:30
Visual Studio (incluyendo VS 2010) no soporta esas funciones. Como son parte del estándar C99 la palabra oficial de MS es que VS es un compilador de C++, no de C.  :bad:

En esta página puedes encontrar una implementación de erf() para C++:  http://www.johndcook.com/cpp_erf.html (http://www.johndcook.com/cpp_erf.html" onclick="window.open(this.href);return false;)

Lo copio abajo, por si desaparece dicha página:
Código: C++
  1.  
  2. #include <cmath>
  3. #include <cstdio>
  4.  
  5. double erf(double x)
  6. {
  7.     // constants
  8.     double a1 =  0.254829592;
  9.     double a2 = -0.284496736;
  10.     double a3 =  1.421413741;
  11.     double a4 = -1.453152027;
  12.     double a5 =  1.061405429;
  13.     double p  =  0.3275911;
  14.  
  15.     // Save the sign of x
  16.     int sign = 1;
  17.     if (x < 0)
  18.         sign = -1;
  19.     x = fabs(x);
  20.  
  21.     // A&S formula 7.1.26
  22.     double t = 1.0/(1.0 + p*x);
  23.     double y = 1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x);
  24.  
  25.     return sign*y;
  26. }
  27.  
  28. void main()
  29. {
  30.     // Select a few input values
  31.     double x[] =
  32.     {
  33.         -3,
  34.         -1,
  35.         0.0,
  36.         0.5,
  37.         2.1
  38.     };
  39.  
  40.     // Output computed by Mathematica
  41.     // y = Erf[x]
  42.     double y[] =
  43.     {
  44.         -0.999977909503,
  45.         -0.842700792950,
  46.         0.0,
  47.         0.520499877813,
  48.         0.997020533344
  49.     };
  50.  
  51.     int numTests = sizeof(x)/sizeof(double);
  52.  
  53.     double maxError = 0.0;
  54.     for (int i = 0; i < numTests; ++i)
  55.     {
  56.         double error = fabs(y[i] - erf(x[i]));
  57.         if (error > maxError)
  58.             maxError = error;
  59.     }
  60.  
  61.     printf("Maximum error: %fn", maxError);
  62. }    
  63.  
  64.  
Título: Re: Funcion de error, erf(X)
Publicado por: Lomko en Lunes 2 de Agosto de 2010, 11:57
Gracias Amilius, pero como ya dije, soy un novato muy novato.

Lo que entiendo de este código es que al principio define la función de error. Luego con el "void main" empieza lo que sería un programilla en el que introduce un array de valores para que le resuelva en otro array de respuestas, no? Pero como tendría que hacer para darle yo x=2 y que me saque a ser posible en la ventanita negra (de MSdos?¿?) su valor de la función de error? He estado jugando un poco y sí, añadiendo al final getchar(); me saca el error del cálculo (o eso entiendo que hace). Pero yo quiero el valor de la función de error, asike tras jugar, no he llegado a nada sustancial. Agradecería toda ayuda en este sentido, gracias.

Un saludo
Título: Re: Funcion de error, erf(X)
Publicado por: Amilius en Lunes 2 de Agosto de 2010, 22:10
Bueno eso es bastante básico, en lugar del anterior main, tendrías que usar uno como este:

Código: C++
  1.  
  2. void main()
  3. {
  4.     double x = 2.0;
  5.     printf("erf(%f) = %fn", x, erf(x));
  6. }
  7.  
  8.  

Sería mejor si buscas un tutorial para que vayas aprendiendo a usar estos aspectos básicos paso a paso.