A Program to View the Binary Representation of Floating-Point Numbers

Don't panic - this program uses C features not explained in lectures yet.

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

void
print_byte(uint8_t *address) {
    int i;
    for (i = 7; i >= 0; i--)
        if (*address & (1 << i))
            printf("1");
        else
            printf("0");
}

void
print_bytes(uint8_t *address, int n, int big_endian) {
    int i;
    if (big_endian)
       for (i = 0; i < n; i++)
          print_byte(address + i);
    else
       for (i = n - 1; i >= 0; i--)
          print_byte(address + i);
    printf("\n");
}

int
main(int argc, char *argv[]) {
    if (argc < 2)
        return 1;
    double d = atof(argv[1]);
    float f = d;
    printf("Bit pattern for %g in these types:\n", d);
    printf("%-10s", "float:");
    print_bytes((uint8_t *)&f, sizeof f, 0);
    printf("%-10s", "double:");
    print_bytes((uint8_t *)&d, sizeof d, 0);
    return 0;
}
A Program to Decompose the Binary Representation of Floats Don't panic - this program uses C features not explained in lectures yet.

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

void
print_bits(uint32_t word, int start_bit, int finish_bit) {
    int i;
    for (i = finish_bit; i >= start_bit; i--)
        if (word & (1 << i))
            printf("1");
        else
            printf("0");
}

int
main(int argc, char *argv[]) {
    if (argc < 2)
        return 1;
    float f = atof(argv[1]);
    uint32_t raw_bits = *(uint32_t *)&f;
    printf("Bit pattern for %g as an IEEE-754 float:\n", f);
    print_bits(raw_bits, 0, 31);
    printf("\n");
    uint32_t sign_bit = (raw_bits >> 31);
    uint32_t raw_exponent = (raw_bits << 1) >> 24;
    uint32_t raw_mantissa = (raw_bits << 9) >> 9;
    printf("Sign bit: ");
    print_bits(raw_bits, 31, 31);
    printf("\n");
    printf("Raw Exponent (base 2): ");
    print_bits(raw_bits, 23, 30);
    printf("\nRaw Exponent (base 10): %d\n", raw_exponent);
    uint32_t actual_exponent = raw_exponent - 127;
    printf("Actual Exponent: %d - 127 = %d\n", raw_exponent, actual_exponent);
    printf("Raw Mantissa: ");
    print_bits(raw_bits, 0, 22);
    printf("\n");
    printf("Actual Mantissa (base 2): 1.");
    print_bits(raw_mantissa, 0, 22);
    printf("\n");
    double actual_mantissa = 1 + raw_mantissa / (double)(1<<23);
    printf("Actual Mantissa (base 10): %g\n", actual_mantissa);
    printf("So %g is represented as: ", f);
    if (sign_bit)
        printf("-1 * ");
    printf("%g * 2 ^ %d\n", actual_mantissa, actual_exponent);
    return 0;
}

Index