miércoles, 2 de noviembre de 2011

Límites de tipos de datos y presición de la maquina

¿ Te encuentras programando algoritmos de métodos númericos en C++ ?. Quiza, también, una de las primeras tareas consiste en hallar los limites y la precisión de la maquina para algunos tipos de datos.


Si te encuentras en esta situación, te comparto un código de muestra. Espero, al menos, sirva para ayudarte en la resolución de tu tarea.

#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#include<math.h>
#define EXPONENTE 6
#define BASE 10
//---------------------------------------------------------
// Retorna Entero Maximo
int overUpInt()
{ int val=0,aux=1,pos=sizeof(int),i=0;
  while((val+(aux<<1))>0)
  { i=0; aux=1;
    while((aux<<1)>0 && i<=pos) {aux=aux<<1; i++;}
    val=val+aux; pos=i;
  }// fin while
  while((val+1)>0) { val=val+1; }
  return(val);
}// fin funcion
//--------------------------------------------------------
// Retorna Entero Minimo
int overDownInt()
{ int val=overUpInt();
  val=-val-1;
  return(val);
}// fin funcion
//--------------------------------------------------------
// Retorna Long Entero Maximo
long int overUpLongInt()
{ long int val=0,aux=1,pos=sizeof(long int),i=0;
  while((val+(aux<<1))>0)
  { i=0; aux=1;
    while((aux<<1)>0 && i<=pos) {aux=aux<<1; i++;}
    val=val+aux; pos=i;
  }// fin while
  while((val+1)>0) { val=val+1; }
  return(val);
}// fin funcion
//--------------------------------------------------------
// Retorna Long Entero Minimo
long int overDownLongInt()
{ long int val=overUpLongInt();
  val=-val-1;
  return(val);
}// fin funcion
//---------------------------------------------------------------------
// Retorna el maximo Float
float overUpFloat()
{ float val=1.0, ant,i=2.0;
  do{
    do
    { ant=val;
      val=val*i;
    }while((ant)==(val/i));
    val=ant;
    i=i-1/pow(BASE,EXPONENTE);
   }while(i>1.0);
  return(val);
}// fin de funcion
//--------------------------------------------------------
// Retorna el maximo Double
double overUpDouble()
{ double val=1.0, ant,i=2.0;
  do{
    do
    { ant=val;
      val=val*i;
    }while((ant)==(val/i));
    val=ant;
    i=i-1/pow(BASE,EXPONENTE);
   }while(i>1.0);
  return(val);
}// fin de funcion
//------------------------------------------------------------------------
// Retorna el minimo Float
float overDownFloat()
{ float val=1.0, ant,i=2.0;
    do
    { ant=val;
      val=val/i;
    }while((ant)==(val*i));
  return(ant);
}// fin de funcion
//--------------------------------------------------------
// Retorna el minimo double
double overDownDouble()
{ double val=1.0, ant,i=2.0;
    do
    { ant=val;
      val=val/i;
    }while((ant)==(val*i));
  return(ant);
}// fin de funcion
//--------------------------------------------------------
// Retorna el epsilon de un Float
float epsilonFloat()
{ float eps=1.0,ant,var;
  do
    { ant=eps;
      eps=eps/2;
      var=1.0+eps;
    } while(var!=1.0);
    return(ant);
}// fin de funcion
//--------------------------------------------------------
// Retorna el epsilon de un Double
double epsilonDouble()
{ double eps=1.0,ant,var;
  do
    { ant=eps;
      eps=eps/2;
      var=1.0+eps;
    } while(var!=1.0);
    return(ant);
}// fin de funcion
//-------------------------------------------------------------------------
// Main Principal
int main()
{ printf("\n Limites Maximos y minimos de algunos tipos de datos...");
  printf("\n int Max : %d",overUpInt());
  printf("\n int Min : %d",overDownInt());
  printf("\n long int Max : %ld",overUpLongInt());
  printf("\n long int Min : %ld",overDownLongInt());
  printf("\n Float Max : %e",overUpFloat());
  printf("\n Float Min : %e",overDownFloat());
  printf("\n Double Max : %e",overUpDouble());
  printf("\n Double Min : %e",overDownDouble());
  printf("\n ------------------------------------------------------------------");
  printf("\n Valores de epsilon hallados para Float y Double...");
  printf("\n Epsilon Float : %e",epsilonFloat());
  printf("\n Epsilon Double : %e",epsilonDouble());
  return(0);
}// fin de Main

Algunos de los resultados obtenidos se muestran en las siguientes figuras,



Y como es costumbre, en el siguiente link puedes descargar el código, una descripción e imagenes mostradas anteriormente: Descargar Código e Imagenes.

Saludos - FaithHeart

No hay comentarios:

Publicar un comentario