C/Visual C - Problema al sacar parte entera

 
Vista:
sin imagen de perfil

Problema al sacar parte entera

Publicado por Edwin (70 intervenciones) el 31/10/2006 22:24:40
Hola a todos...
Por casualidad se me presentó un problema al sacar la parte entera de un número. por ejemplo:
double x;
x = int(4.99)
En este caso x valdría 4.
Pero sí pongo
x = int(4.9999999999999999);
En vez de salir 4 me sale 5. Uhmm... hay alguna manera de que solo me salga el entero verdadero, en este caso el 4.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema al sacar parte entera

Publicado por fernando.gomez (1603 intervenciones) el 31/10/2006 22:45:23
Emplea la función floor():

double x = floor(4.99999999);

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:da lo mismo, Problema al sacar parte entera

Publicado por Edwin (70 intervenciones) el 31/10/2006 23:18:17
Me da lo mismo, me conviene mas usar el int, ya que cuando intento sacar -4.22 me retorna -4 y sí lo hago con floor me retorna -5.
Lo necesito para mostrar los enteros de dos números ingresados por teclado, ya lo hize pero el problema es cuando se ingresa del 1 al 4.9999999999999999, osea al sacarle la parte entera al segundo número ingresado, me retorna 5, ya sea con el int o floor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:da lo mismo, Problema al sacar parte entera

Publicado por fernando.gomez (1603 intervenciones) el 31/10/2006 23:46:06
Pues si el número es mayor a cero, emplea floor; si es menor a cero, emplea ceil.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:da lo mismo, Problema al sacar parte entera

Publicado por Edwin (70 intervenciones) el 01/11/2006 00:15:43
OK, te entiendo perfectamente, pero; mira, tú eres matemático, por lo tanto el número 5 y el 4.9999999999999999 son diferentes,pero el visual me dice que son iguales, osea la sacarle el floor al 4.9999999999999999 , según la función me debe retornar el 4, pero como te digo me lo reconoce como 5 y usando floor me retorna 5.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:da lo mismo, Problema al sacar parte entera

Publicado por fernando.gomez (1603 intervenciones) el 01/11/2006 20:13:14
Je, de hecho te puedo probar -y no bromeo- que 4.9999... = 5. Es un teorema bastante sencillo que se prueba en los primeros cursos de cálculo.

Pero esto no son matemáticas, es computación. Y a diferencia de las mates, la programación no es exacta. Esto, porque hay límites en memoria. Lo único que se me ocurre es que estés rebasando la capacidad del punto flotante poniéndole muchos decimales, de tal suerte que el compilador te lo redondea (por cierto, en base al teorema anterior).

Para este tipo de problemas tienes que emplear técnicas avanadas, como crear campos de bits, empleando DWORDs para el manejo de memoria, etc. Pero al parecer sí tendrás que ingeniártelas -por ejemplo, convirtiendo a char- porque si al compilador se le acaban los bits e interpreta 4.999999999999999 como 5... pues entonces 4.999999999999 == 5.0.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:da lo mismo, Problema al sacar parte entera

Publicado por Eduardo (17 intervenciones) el 01/11/2006 20:20:51
Mira, el problema no es de la función, al parecer el numero es muy largo para poder ser almacenado en un long double, por eso, y si haces un debug de tu programa te darás cuanta que al momento de hacer la asignación del numero a la variable esta de trasforma en 5, y no cuando se utiliza la funcion floor, estoy investigando para ver como se puede evitar esto, debe de ser alguna opción en el compilador.

¿Que compilador utilizas?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:da lo mismo, Problema al sacar parte entera

Publicado por Edwin (70 intervenciones) el 01/11/2006 22:13:18
OK.
De hecho convertiendo a char se puede lograr. Pero a mi parecer sería como sí mi S.O. tenga errores por varias causas y
mi solución a dar sería formatearla.
Bueno aún en la universidad no he llevado cálculo, por eso no puedo comprobar el teorema que tu dices; pero en los reales del 4 al 5 existen infinidades de números,pero bueno, uso el visual studio 6 y lo reconoce como 5. Muchas Graciás...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:da lo mismo, Problema al sacar parte entera

Publicado por Edwin (70 intervenciones) el 01/11/2006 22:13:39
OK.
De hecho convertiendo a char se puede lograr. Pero a mi parecer sería como sí mi S.O. tenga errores por varias causas y
mi solución a dar sería formatearla.
Bueno aún en la universidad no he llevado cálculo, por eso no puedo comprobar el teorema que tu dices; pero en los reales del 4 al 5 existen infinidades de números,pero bueno, uso el visual studio 6 y lo reconoce como 5. Muchas Graciás...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema al sacar parte entera

Publicado por Tom (619 intervenciones) el 02/11/2006 08:30:53
Prueba con trunc()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar