• Sábado 20 de Abril de 2024, 05:56

Autor Tema:  Resultado distinto según número decimal.  (Leído 2022 veces)

cotolon

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Resultado distinto según número decimal.
« en: Sábado 17 de Noviembre de 2012, 18:18 »
0
Hola a todos!  :jumpie:

Tengo una duda, resulta que este código (lo pongo después de mi pregunta), te pide un número decimal finito y positivo. Luego entra a un while hasta calcular que potencia de 10 hay que multiplicarlo, para que sea un número entero. Por ej:

(I) 12.456
(O) Hay que multiplicarlo por 1000

El problema es que si ingreso

0.07 o 1.07 (con otros números también incluidos) no devuelve 100, devuelve algo así como 2132312343 (número grande)
Pero con 2.07, 3.07, 4.07.... N.07 (N > 1) si funciona, alguien sabe por qué?

Código:

Código: [Seleccionar]
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    double numero;
    int potencia10 =1;

    do{
        cout << "Ingrese Numero: ";
        cin >> numero;
    }while(numero < 0);

    while(floor(numero) != numero){
        numero = numero*10;
        potencia10 = potencia10 * 10;
    }

    cout << "Hay que multiplicarlo por " << potencia10;
    cout << " Para que sea un numero entero" << endl;
    return 0;
}

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:Resultado distinto según número decimal.
« Respuesta #1 en: Sábado 17 de Noviembre de 2012, 22:09 »
0
El problema se encuentra en los errores de redondeo al trabajar con numeros de punto flotante.

Cuando se guarda un numero de punto flotante, al contrario de los numeros enteros, en realidad es una aproximacion al numero verdadero, esto es debido a que no es posible guardar de manera exacta un numero de punto flotante cualquiera con un numero limitado de bits.

En el caso del numero 0.07, internamente se guarda como el numero 0.070000000000000007, que como podras ver no es exactamente 0.07, si tu utilizas cout para desplegar y comprobar el numero veras 0.07, porque el cout tambien te redondea los decimales, para poder ver el numero real que se guarda internamente en la memoria es necesario utilizar el manipulador fixed.

Te dejo a continuacion el programa modificado, usando fixed, para que puedas ver los errores en el redoneo:

Código: [Seleccionar]
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    double numero;
    int potencia10 =1;

    do{
        cout << "Ingrese Numero: ";
        cin >> numero;
    }while(numero < 0);

    cout.precision(20);
    cout << fixed << numero << endl;
    while(floor(numero) != numero){
        numero = numero*10;
        cout << fixed << numero << endl;
        potencia10 = potencia10 * 10;
    }

    cout << "Hay que multiplicarlo por " << potencia10;
    cout << " Para que sea un numero entero" << endl;
    return 0;
}

Como nota adicional, no podemos evitar los errores de redondeo, solo podemos minimizarlos

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

cotolon

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re:Resultado distinto según número decimal.
« Respuesta #2 en: Sábado 17 de Noviembre de 2012, 23:58 »
0
Gracias profesorX!