Problemas con variable "double"

Iniciado por MauricioEsp, 28 Septiembre 2016, 00:00 AM

0 Miembros y 1 Visitante están viendo este tema.

MauricioEsp

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.




JonaLamper

¿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?
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

MauricioEsp

Cita de: 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?

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.

BloodSharp




dato000

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:


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


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.




BloodSharp

#5
Cita de: 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.
(...)
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#