【学习体会】float32浮点数

float结构如下图:

https://blog.csdn.net/whzhaochao/article/details/12887779

float的数学计算式如下:

float32=(-1)^{sign}*1.base*2^{exponent-127}

其中,

符号位: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

数学式为1.1111 1111 1111 1111 1111 111*2^{127}

理论值约为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

数学式为1.0000 0000 0000 0000 0000 001*2^{-127}

理论值约为(1+2^{-23})*2^{-127}\approx 5.8E-39

实际c计算为:2^{-149}\approx 1.4E-45(关于这一点暂时没有想明白!)

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值