Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: MauricioEsp en 28 Septiembre 2016, 00:00 am



Título: Problemas con variable "double"
Publicado por: MauricioEsp en 28 Septiembre 2016, 00:00 am
Muy buenas tardes. Tengo un conflicto con la lectura de una variable de tipo double
necesito que la variable sea 0.100000000, que será el dato que un "robot" asignará.
El robot dará el dato 0.1, por lo que la variable debe tener el valor 0.1000000000
El problema está en que, cuando se hace este escaneo, el valor es 0.1000000001.
¿A qué se debe ésto y cómo puedo arreglarlo?
He intentado con lo siguiente:
(Intento 1)

double x;

scanf("%f", &x); (al escanear el valor es 0.1000000001

(intento 2)

double x;

scanf("%lf", &x); (al escanear el valor es 0.1000000001

Muchas gracias de antemano.





Título: Re: Problemas con variable "double"
Publicado por: JonaLamper en 28 Septiembre 2016, 00:39 am
¿El valor es 0.1000000001 y tú quieres quedarte sólo con 0.1? ¿No puedes truncar el número para quedarte sólo con el primer decimal o lo estoy entendiendo mal?


Título: Re: Problemas con variable "double"
Publicado por: MauricioEsp en 28 Septiembre 2016, 00:42 am
¿El valor es 0.1000000001 y tú quieres quedarte sólo con 0.1? ¿No puedes truncar el número para quedarte sólo con el primer decimal o lo estoy entendiendo mal?

Algo así:
El valor al escanear 0.1 es 0.1000000001, Quisiera saber a qué se debe ese molesto 1 del final y si hay forma de que, al escanear un decimal en double, éste pueda salir sin necesidad de mostrar un número al final.

Otro ejemplo es cuando intento escanear el 0.2, éste se almacena en la variable con el valor de 0.200000003, No comprendo por qué ese último número del final, ¿Puede cambiarse? Gracias de antemano.


Título: Re: Problemas con variable "double"
Publicado por: BloodSharp en 28 Septiembre 2016, 01:02 am
Ahí está la explicación...

http://docs.python.org.ar/tutorial/2/floatingpoint.html#error-de-representacion


B#


Título: Re: Problemas con variable "double"
Publicado por: dato000 en 28 Septiembre 2016, 15:57 pm
Y ocurre lo mismo al asignar directamente el valor en la variable??? puede que sea más un error de asignación de memoria respecto al valor númerico por la precisión de ese rango coma flotante.

es decir, intenta:

Código
  1. double x = 0.1; // no puedes asignar un valor de ceros, son inexistentes para el compilador
  2. printf(%.10f, x);
  3.  

o lo que se necesitaria seria asignar ese valor como string y luego castearlo para que puedas establecer el número de digitos permitdios después del coma flotante.



Título: Re: Problemas con variable "double"
Publicado por: BloodSharp en 29 Septiembre 2016, 00:44 am
Y ocurre lo mismo al asignar directamente el valor en la variable??? puede que sea más un error de asignación de memoria respecto al valor númerico por la precisión de ese rango coma flotante.
(...)
o lo que se necesitaria seria asignar ese valor como string y luego castearlo para que puedas establecer el número de digitos permitdios después del coma flotante.(...)

Es irrelevante en todos los micro-controladores/procesadores modernos se usa el estandar IEE 754 y siempre va a tener un mínimo de error de precisión dado que no se puede representar números no divisibles por 2, sin importar lenguaje de programación, tipo de arquitectura, etc...

En el caso de 0.1f:
1.0 /2-->0.5 /2-->0.25 /2-->0.125 /2-->0.0625 /2-->0.03125 /2-->0.015625 /2-->0,0078125 y podría seguir así y nunca llegar a 0.1 aunque sigas sumandos bits por derecha nunca llegarás al número exacto...


B#