es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

5456.367 -> 5456.367188. ¿Es esto debido a la precisión de los números flotantes en C?

Tengo un programa en C como este:

#include <stdio.h>

int main() {
    float number = 0;
    scanf("%f", &number);
    printf("%f\n", number);
}

Y el resultado es:

ururay@note:~/workspace/c/float-precision$ gcc float-precision.c -o float-precision
ururay@note:~/workspace/c/float-precision$ ./float-precision 
5456.367
5456.367188

He ejecutado este programa varias veces y el resultado es el mismo. ¿Se le agrega “188” al final del número debido a la precisión de los flotantes? Si es así, ¿cómo puedo identificar esto en la representación binaria?</stdio.h>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, el ‘188’ se “añade” al final del número debido a la precisión de los números flotantes. En la representación binaria, podemos identificar esto utilizando el estándar IEEE 754 para aritmética de punto flotante.

    El tipo de datos float en C se implementa utilizando el estándar IEEE 754. Según este estándar, un float consta de 32 bits divididos en 3 partes: el bit de signo (1 bit), el exponente (8 bits) y la fracción (23 bits). El valor del float se calcula de la siguiente manera:

    (-1)^bit de signo * (1 + fracción) * 2^(exponente – 127)

    La parte fraccionaria del número es la responsable de la precisión del float. En este caso, la parte fraccionaria es ‘367188’ en binario. Para ver esto en la representación binaria, podemos usar el siguiente código:

    #include <stdio.h>
    
    typedef union {
        float f;
        unsigned int i;
    } float_t;
    
    void print_binary(unsigned int n) {
        for(int i = 31; i >= 0; i--) {
            printf("%d", (n >> i) & 1);
        }
    }
    
    int main() {
        float number = 5456.367;
        float_t f;
        f.f = number;
        printf("Decimal: %f\n", number);
        printf("Binary : ");
        print_binary(f.i);
        printf("\n");
    }
    

    Esto dará como resultado lo siguiente:

    Decimal: 5456.367188
    Binary : 01000010101011100110011000111100
    

    Podemos ver que la parte fraccionaria es de hecho ‘367188’ en binario.</stdio.h>

Comments are closed.