『单精度浮点数』(高位->低位)
符 号:1位
指数部分:8位
小数部分:23位
整数部分:设定恒为1,因此不需要位
总 计:32位
表 示:1.小数部分 * 2^(指数部分 - 127) =
(2^23 + 小数部分) * 2^(指数部分 - 150)
『双精度浮点数』(高位->低位)
符 号:1位
指数部分:11位
小数部分:52位
整数部分:设定恒为1,因此不需要位
总 计:64位
表 示:1.小数部分 * 2^(指数部分 - 1023) =
(2^52 + 小数部分) * 2^(指数部分 - 1075)
『值:零』
指数值:0
小数值:任意
『值:无穷』
指数值:-1
小数值:0
『值:非数』
指数值:-1
小数值:非0
符 号:1位
指数部分:8位
小数部分:23位
整数部分:设定恒为1,因此不需要位
总 计:32位
表 示:1.小数部分 * 2^(指数部分 - 127) =
(2^23 + 小数部分) * 2^(指数部分 - 150)
『双精度浮点数』(高位->低位)
符 号:1位
指数部分:11位
小数部分:52位
整数部分:设定恒为1,因此不需要位
总 计:64位
表 示:1.小数部分 * 2^(指数部分 - 1023) =
(2^52 + 小数部分) * 2^(指数部分 - 1075)
『值:零』
指数值:0
小数值:任意
『值:无穷』
指数值:-1
小数值:0
『值:非数』
指数值:-1
小数值:非0
#include <stdint.h>
#include <stdio.h>
#define SINGLE_F 23
#define SINGLE_E 8
#define DOUBLE_F 52
#define DOUBLE_E 11
typedef union {
float value;
struct {
uint32_t fraction: SINGLE_F;
uint32_t exponent: SINGLE_E;
uint32_t sign: 1;
};
} single_t;
typedef union {
double value;
struct {
uint64_t fraction: DOUBLE_F;
uint64_t exponent: DOUBLE_E;
uint64_t sign: 1;
};
} double_t;
void single_println(single_t *this) {
int32_t exponent;
uint32_t fraction;
exponent = this->exponent - SINGLE_F - ((1u << SINGLE_E - 1) - 1);
fraction = this->fraction | 1u << SINGLE_F;
if (this->sign) {
putchar('-');
}
printf("%u*2^%d\n", fraction, exponent);
return;
}
void double_println(double_t *this) {
int64_t exponent;
uint64_t fraction;
exponent = this->exponent - DOUBLE_F - ((1ull << DOUBLE_E - 1) - 1);
fraction = this->fraction | 1ull << DOUBLE_F;
if (this->sign) {
putchar('-');
}
printf("%llu*2^%lld\n", fraction, exponent);
return;
}
int main(void) {
for (; ; ) {
int mode;
puts("1. single");
puts("2. double");
printf("mode: ");
scanf("%d", &mode);
switch(mode) {
single_t s;
double_t d;
case 1:
scanf("%f", &s.value);
single_println(&s);
break;
case 2:
scanf("%lf", &d.value);
double_println(&d);
break;
default:
puts("error");
}
}
return 0;
}