[C con Clase] Como truncar los decimales (float ) en C.

Ali Rincon alrincon1963 en hotmail.com
Sab Mayo 20 01:21:29 CEST 2017


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 en conclase.net
SP> Blog con Clase: http://blogconclase.wordpress.com
SP> Con Clase: http://conclase.net
SP> _______________________________________________
SP> Lista de correo Cconclase Cconclase en 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.


Más información sobre la lista de distribución Cconclase