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