float结构如下图:
(https://blog.csdn.net/whzhaochao/article/details/12887779)
float的数学计算式如下:
其中,
符号位:sign,正数为0,负数为1
指数位:exponent,二进制数转10进制数,范围是-127(0000 0000)~127(1111 1110)
尾数位:base,二进制数
举个例子:
假设有个浮点数 -12.75 ,我们把它转换成二进制
因为它是负数,所以符号位就是 1 (相反,正数的话符号位就是 0 )
我们先将 12.75(忽略负号)转换成二进制小数 1100.11 (这里不明白怎么转换的,再去看看上面两张图)
然后再将这个二进制小数转换成科学计数法 1.10011 *2^3 ,这时候我们就得到了尾数部分,为小数部分 10011,后面补 0,占满23位,即 10011000000000000000000
最后,我们只差指数位没有填进去了,理所当然的,指数位就是要把 2^3的指数 3 填进去,怎么填进去呢(注意:指数也有可能是负数)
填进去的方法就是 加上127 然后 转 2 进制 再填进去,具体就是 3 + 127 = 130 => 10000010
(https://blog.csdn.net/qq_41877840/article/details/107585667)
输出float的十六进制数(C/C++) :
#include<stdio.h>
#include<iostream>
using namespace std;
void main(int argc, char* argv[])
{
float a = 2;
unsigned char *p = (unsigned char *)&a;
*p = 0xff;
*(p + 1) = 0xff;
*(p + 2) = 0x7f;
*(p + 3) = 0x7f;
for (int i = sizeof(a) - 1; i >= 0; i--)
{
printf("%02X", p[i]);
}
printf("\n");
printf("\na=%e", a);
}
//https://zhidao.baidu.com/question/478878712.html
float的正数最大值 :
十六进制0x7F7FFFFF
二进制0111 1111 0111 1111 1111 1111 1111 1111
数学式为
理论值约为3.8E+38
实际c计算得到如下:
在C中,对于0x7FFFFFFF,表示0111 1111 1111 1111 1111 1111 1111 1111,输出为NAN
float的正数最小值:
十六进制0x00000001
二进制0000 0000 0000 0000 0000 0000 0000 0001
数学式为
理论值约为
实际c计算为:(关于这一点暂时没有想明白!)