Hilo
Como truncar los decimales (float ) en C. (Ali Rincon) 2017-05-18 18:28:40
Hola a todos. Mi problema es el siguiente: Tengo el siguiente vector de probabilidades,
vectorFAP0 = 58.601799 12.023691 61.179775 45.886543 62.586872 67.924271 53.168545 70.105103 23.177788 48.971207 74.884453 28.409052 79.283783 32.123661 57.448048 82.289703 74.696152 86.011162 41.449554 84.230888 89.390259 47.355267 90.971962 51.716938 76.113525
De aqui en adelante necesito trabajar con 1 decimal, despues con 2 decimales, y asi hasta lograr optimizar el problema que trato de resolver, o de buscar la mejor solucion.
Traté de implementar lo siguiente: Definí el vector,
vectorFAP0aux = 5860 1202 6117 4588 6258 6792 5316 7010 2317 4897 7488 2840 7928 3212 5744 8228 7469 8601 4144 8423 8939 4735 9097 5171 7611,
el cual lo obtuve simplemente por,
int *vectorFAP0aux;
float *vectorFAP0;
/*Conversion del vectorFAP0 a dos decimales*/
for(i=0; i<N; i++)
{
vectorFAP0aux[i] = vectorFAP0[i]*100;
}
y despues trate de recobrar el vector vectorFAP0,
for(i=0; i<N; i++)
{
vectorFAP0[i] = vectorFAP0aux[i]/100.0;
}
y lo que obtengo es,
vectorFAP0 = 58.599998 12.020000 61.169998 45.880001 62.580002 67.919998 53.160000 70.099998 23.170000 48.970001 74.879997 28.400000 79.279999 32.119999 57.439999 82.279999 74.690002 86.010002 41.439999 84.230003 89.389999 47.349998 90.970001 51.709999 76.110001.
La ayuda que necesito es, como puedo decirle a C que solo deseo trabajar con 1 decimal, o 2 decimales, o 3 decimales, lo que el programador escoga?? Ojo, mi problema NO es visualizar por pantalla 1, 2 o 3 decimales. Es decirle a C que trabaje con 1, 2 o 3 decimales, pues necesito estudiar la influencia en las probabilidades de estos digitos decimales, en el problema que estudio.
Gracias de antemano por toda la ayuda que me puedan brindar.
Muy atentamente,
Ali Rincon.
Venezuela.
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: Como truncar los decimales (float ) en C. (Salvador Pozo) 2017-05-19 08:12:17
El pasado 2017-05-18 18:28:40, Ali Rincon escribió:
Hola:
AR> Hola a todos. Mi problema es el siguiente: Tengo el siguiente vector de probabilidades,
AR> ...
El problema es el modo en que los ordenadores almacenan los números en coma flotante. Siempre vas a tener valores imprecisos como los que comentas, ya que la conversión de coma flotante en formato binario interno a decimal, y viceversa, siempre va a perder precisión en los últimos dígitos significativos.
Una solución es trabajar con números enteros, como en la primera aproximación que comentas. En ese caso, los dos últimos dígitos serán los decimales, de modo que, por ejemplo, para el valor 58.601799 trabajas con el entero 5860, y obtienes el segundo decimal como n % 10, y el primero como ((n%100)-(n%19))/10, y así sucesivamente.
El problema que puedes tener en este caso es que los valores en coma flotante sean demasiado grandes para contenerlos en un entero, y tengas un desbordamiento.
Otra posible solución es convertir el número a una cadena, usando "sprintf", y trabajar con cada carácter de la cadena para obtener los decimales. Por ejemplo, 58.601799 se convertiría en "58.60", y podrías obtener el segundo decimal como:
n[strlen(n)-1]-'0'
Y el primer decimal como:
n[strlen(n)-2]-'0'
En general, cuando se requiere mucha precisión con números grandes, o con muchos decimales, es mejor usar otros métodos de almacenamiento de números en lugar de usar coma flotante. Existen librerías para trabajar con números que evitan el problema de la falta de precisión del formato de coma flotante, a costa (claro) de perder velocidad de proceso y de complicar las operaciones con números.
Hasta pronto.
--
Salvador Pozo (Administrador)
mailto:salvador@conclase.net
Blog con Clase: http://blogconclase.wordpress.com
Con Clase: http://conclase.net
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: Como truncar los decimales (float ) en C. (Ali Rincon) 2017-05-19 23:21:29
El pasado 2017-05-19 08:12:17, Salvador Pozo escribió:
SP> El pasado 2017-05-18 18:28:40, Ali Rincon escribió:
SP>
SP> Hola:
SP> AR> Hola a todos. Mi problema es el siguiente: Tengo el siguiente vector de probabilidades,
SP> AR> ...
SP> El problema es el modo en que los ordenadores almacenan los números en coma flotante. Siempre vas a tener valores imprecisos como los que comentas, ya que la conversión de coma flotante en formato binario interno a decimal, y viceversa, siempre va a perder precisión en los últimos dígitos significativos.
SP> Una solución es trabajar con números enteros, como en la primera aproximación que comentas. En ese caso, los dos últimos dígitos serán los decimales, de modo que, por ejemplo, para el valor 58.601799 trabajas con el entero 5860, y obtienes el segundo decimal como n % 10, y el primero como ((n%100)-(n%19))/10, y así sucesivamente.
SP> El problema que puedes tener en este caso es que los valores en coma flotante sean demasiado grandes para contenerlos en un entero, y tengas un desbordamiento.
SP> Otra posible solución es convertir el número a una cadena, usando "sprintf", y trabajar con cada carácter de la cadena para obtener los decimales. Por ejemplo, 58.601799 se convertiría en "58.60", y podrías obtener el segundo decimal como:
SP> n[strlen(n)-1]-'0'
SP> Y el primer decimal como:
SP> n[strlen(n)-2]-'0'
SP> En general, cuando se requiere mucha precisión con números grandes, o con muchos decimales, es mejor usar otros métodos de almacenamiento de números en lugar de usar coma flotante. Existen librerías para trabajar con números que evitan el problema de la falta de precisión del formato de coma flotante, a costa (claro) de perder velocidad de proceso y de complicar las operaciones con números.
SP> Hasta pronto.
SP> --
SP> Salvador Pozo (Administrador)
SP> mailto:salvador@conclase.net
SP> Blog con Clase: http://blogconclase.wordpress.com
SP> Con Clase: http://conclase.net
SP> _______________________________________________
SP> Lista de correo Cconclase Cconclase@listas.conclase.net
SP> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
SP> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Gracias Salvador por responder a mi inquietud. Voy a implementar tus observaciones. Podrias mencionar, por favor, cuales son esas librerias de C que evitan esa falta de precision de float??
Gracias por tu tiempo.
Muy agradecido,
Ali Rincon
Venezuela.
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: Como truncar los decimales (float ) en C. (Salvador Pozo) 2017-05-21 15:01:42
El pasado 2017-05-19 23:21:29, Ali Rincon escribió:
AR> Gracias Salvador por responder a mi inquietud. Voy a implementar tus observaciones. Podrias mencionar, por favor, cuales son esas librerias de C que evitan esa falta de precision de float??
AR> Gracias por tu tiempo.
Hola:
Hay varias librerías que puedes usar, por ejemplo GMP. La página oficial es:
https://gmplib.org/
Si quieres descargar los binarios para MinGW para Windows (Dev-C++, Code::Blocks o ZinjaI), puedes encontrarlos en esta otra:
http://www.cs.nyu.edu/exact/core/gmp/
Hasta pronto.
--
Salvador Pozo (Administrador)
mailto:salvador@conclase.net
Blog con Clase: http://blogconclase.wordpress.com
Con Clase: http://conclase.net
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ