浮点数是与定点数相对的概念,计算机中的定点数约定小数点的位置不变。
由于计算机字长的限制,当需要表示的数据有很大的数值范围时,不能直接用定点小数或者定点整数表示。
浮点数由尾数 M M M和阶码 E E E构成。
基数为2的数
F
F
F的浮点数表示为:
F
=
2
E
×
M
F = 2^E \times M
F=2E×M
浮点数编码的规则:
浮点数的编码格式有多种,格式的选择可以由计算机设计人员决定,例如:
详细解释
IEEE 754规定单精度浮点数的真值一般表示为:
N
=
(
?
1
)
s
×
2
e
?
127
×
1.
f
N = (-1)^s \times 2^{e-127} \times 1.f
N=(?1)s×2e?127×1.f
单精度浮点数的编码格式由3个字段构成
注意点:
IEEE 754阶码的规定
IEEE 754标准的32位浮点数格式为:
阶码e全0和全1时的特殊含义:
浮点数的舍入规则:
展示C语言中单精度1.0和-1.0的表示
#include <stdio.h>
#include <stdlib.h>
/**
* float 31 30-23 22-0
* 符号位 阶码 尾数
*/
/**
* 大端模式(大端字节序):低字节内容存在高地址,高字节内容存在低地址。
* 小端模式(小端字节序):低字节内容存在低地址,高字节内容存在高地址。
*/
char if_big_endian(){
short endian = 1;
if( endian&0x01 == 1 ){
return 0;
}else {
return 1;
}
}
void print_byte( char*data){
for( int i=7;i>=0;i--){
printf("%d",((*data)>>i)&0x01);
}
}
void print_data( char *data, int byte_len){
for(int i=0;i<byte_len;i++){
if( if_big_endian() ){
print_byte(data+i) ;
} else {
print_byte(data+ byte_len -1 -i) ;
}
}
printf("\r\n");
}
void set_bit(char * data,int byte_len,int idx){
int byte_idx = idx/8;
int bit_idx = idx%8;
if( !if_big_endian() ){
*(data+byte_idx) |= 0x01 << bit_idx;
} else {
*(data+ byte_len -1 -byte_idx) |= 0x01 << bit_idx;
}
}
void reset_bit(char * data,int byte_len,int idx ){
int byte_idx = idx/8;
int bit_idx = idx%8;
if( !if_big_endian() ){
*(data+byte_idx) &= ~(0x01 << bit_idx);
} else {
*(data+ byte_len -1 -byte_idx) &= ~(0x01 << bit_idx);
}
}
int main(){
float num1 = 1;
char * p1 = ( char*)&num1;
printf("float 1: ");
print_data(p1,4);
float num2 = -1;
char * p2 = ( char*)&num2;
printf("float -1: ");
print_data(p2,4);
return 0;
}
https://blog.csdn.net/weixin_45863060/article/details/125054244