elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Quedarme solo con algunos decimales.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Quedarme solo con algunos decimales.  (Leído 2,657 veces)
astinx

Desconectado Desconectado

Mensajes: 111



Ver Perfil
Quedarme solo con algunos decimales.
« en: 4 Abril 2012, 16:50 pm »

Hola, tengo un problema muy sencillo y que aún así me sigue quemando el coco.
Tengo una función que me devuelve un float, un float que es el resultado de 10/3, osea 3,333333...
Quiero recortarle algunos decimales cosa de que me quede como 3,333 o 3,3333.
Lo que hago es sencillo, tomo el float en cuestión, lo multiplico por 10⁴, si quiero tener 4 decimales luego de la coma y lo convierto a entero cosa de que me quede: 33333. Luego lo divido a ese entero, casteado a float por 10⁴, para volver a mover los decimales, cosa de que me quede 3,3333. Sin embargo lo que me ocurre es que cuando lo imprimo formateado como %.100f (cosa de ver todos los decimales posibles), me queda 3,333300000000003454345677. Esto me esta volviendo loco, porque solo me sucede con numeros periódicos y es un razonamiento muy sencillo.

El codigo seria algo como
int decimales = 3;
float miNumero = funcion_que_devuelve_float(10,3);
int miNumero2 = (int)(miNumero * pow(10,decimales));
float miNumero = (float)(miNumero2 / pow(10,decimales));

También intente multiplicar en ambos casos, en uno por la potencia negativa y en otro por la positiva, con el mismo resultado.

Muchas gracias por detenerse a leer y saludos.


En línea

La programación hoy en día es una carrera entre los ingenieros de software intentando construir mejores y más eficientes programas a prueba de idiotas y el Universo intentando producir mejores y más grandes idiotas. De momento, el Universo está ganando
Ferno


Desconectado Desconectado

Mensajes: 375


Ver Perfil
Re: Quedarme solo con algunos decimales.
« Respuesta #1 en: 4 Abril 2012, 17:53 pm »

Esto se debe a que el número 3,3333 que te queda del último cálculo y el casteo a float (simple presición) es irrepresentable perfectamente en una computadora.
Lo que hace la máquina es aproximar este tipo de numeros por el conocido método del "Punto Flotante" que se rige bajo la norma IEEE754.

Se expresan de la forma: mantisa * 2^(exponente) Con la mantisa normalizada (1 =< mantisa < 2).

Lo que hace el micro es (lo explico en simple presición ya que estás usando el tipo float), representar el número utilizando 32 bits. Se utiliza:
1 bit para el signo del número (en este caso 0, positivo)
8 bits para el exponente (con la convención del Exceso-127)
23 bits para la mantisa.

Para el caso particular del 3,3333 éste se representa en binario como 1,10101010101010011001001....(sigue indefinidamente) * 2^(1)

Esto queda, utilizando simple presición:
(signo) | (exponente = 128 (se le suma 127 al exponente 1) ) | mantisa normalizada
0 | 10000000 | 10101010101010011001001

Y el resultado de ésta expresión es el número que se imprime al querer mostrar todos los decimales posibles de tu resultado.

Yo te diría que muestres los decimales que tengas que utilizar, si mostrás todos los posibles, jamás quedará un resultado redondo por lo que expliqué más arriba. Truncalo.
Espero que te sea de ayuda, creí conveniente explicar un poco cómo se maneja el micro en cuanto a números fraccionales.
Saludos!


En línea

astinx

Desconectado Desconectado

Mensajes: 111



Ver Perfil
Re: Quedarme solo con algunos decimales.
« Respuesta #2 en: 6 Abril 2012, 00:19 am »

Gracias, ahora usando _Decimal64 lo solucione :D
En línea

La programación hoy en día es una carrera entre los ingenieros de software intentando construir mejores y más eficientes programas a prueba de idiotas y el Universo intentando producir mejores y más grandes idiotas. De momento, el Universo está ganando
david_BS

Desconectado Desconectado

Mensajes: 99



Ver Perfil WWW
Re: Quedarme solo con algunos decimales.
« Respuesta #3 en: 7 Abril 2012, 20:19 pm »


no se si era lo pedido, pero traté de improvisar algo con referencia a eso..

EI: la idea del foro es ayudar y no hacer.
« Última modificación: 8 Abril 2012, 13:54 pm por Eternal Idol » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
pq solo puedo ver el inicio de algunos .part d e-mule y no del medio si ls tngo?
Multimedia
nichihack 1 1,441 Último mensaje 19 Septiembre 2005, 11:16 am
por pper
Label con solo 2 decimales
Programación Visual Basic
erick185 1 1,362 Último mensaje 22 Septiembre 2006, 03:00 am
por juanjoxx
VB .Net decompilado, necesito quedarme con un trozo de codigo en el EXE.
Ingeniería Inversa
olevlove 2 2,712 Último mensaje 15 Mayo 2010, 21:06 pm
por olevlove
solo con acceso para algunos ususarios
Seguridad
crala 2 2,810 Último mensaje 5 Septiembre 2010, 12:35 pm
por Silici0
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines