ftoi
将浮点数转换成浮点数
浮点数的存储方式
0 : 符号位
1-8 : 指数位
9-31 : 尾数位
可以写个函数来输出浮点数的存储情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| void print_bits(float value) { int i = 0; int n_value = 0;
memcpy(&n_value, &value, 4);
for(i = sizeof(n_value) * 8 - 1; i >= 0; --i){ printf("%d", n_value >> i & 1); if((i & 7) == 0){ printf(" "); } } printf("\n"); }
|
以12.5
为例,输出为01000001 01001000 00000000 00000000
ftoi函数的实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| int ftoi(float value) {
int flag = 0; int index = 0; int tail = 0; int n_value = 0;
memcpy(&n_value, &value, 4);
flag = ((n_value >> ((32) - 1) & 1) == 0 ? 1 : -1); index = (((n_value >> (23)) & (0xFF)) - (127));
tail = (n_value & (0x7FFFFF) | 1 << (23)); if(index < 0){ return 0; }
tail >>= ((23) - index); return tail * flag; }
|
用宏定义实现数的抽取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| int ftoi(float value);
#define BIT_LENGTH (32) #define TAIL_LENGTH (23) #define INDEX_ZERO (127) #define INDEX_LENGTH (0xFF) #define TAIL_MATCH_LENGTH (0x7FFFFF)
#define get_float_flag(val) ((val >> (BIT_LENGTH - 1) & 1) == 0 ? 1 : -1) #define get_float_index(val) (((val >> TAIL_LENGTH) & INDEX_LENGTH) - INDEX_ZERO) #define get_float_tail(val) (val & TAIL_MATCH_LENGTH | 1 << TAIL_LENGTH)
int ftoi(float value) { int flag = 0; int index = 0; int tail = 0; int n_value = 0; memcpy(&n_value, &value, 4);
flag = get_float_flag(n_value); index = get_float_index(n_value); tail = get_float_tail(n_value); if(index < 0){ return 0; }
tail >>= (TAIL_LENGTH - index); return tail * flag; }
|