计算机如何存储浮点数

计算机如何存储浮点数

一、概述

在开始介绍之前,需要知道一些基本知识。按照IEEE754的标准,32位浮点数(float)和64位浮点数(double)的标准格式如下:
f = (-1)^S * (1.M) * 2^e,其中e = E-127或者e = E-1023

在这里插入图片描述
关于上图中的S、E和M介绍如下:

  1. S表示符号位,0:表示正数,1:表示负数;
  2. E表示阶码,简单来说就是将一个浮点数转为二进制数之后,然后将该二进制数移位成1.M的形式时,所需移动的位数+固定偏移,对于单精度固定偏移为127,对于双精度固定偏移为1023.
  3. M表示位数,即将浮点数的整数部分和小数部分转为二进制数之后,通过移位成1.M的形式后M的值。

介绍到这里,可能还有点懵,不着急,后面通过一个例子会清楚它们的含义。

二、浮点数(十进制)转为二进制数的方法

1.浮点数的整数部分转为二进制的方法

整数部分的十进制数除2取余,然后商继续除2取余,直到商为0,从最后一个余数读到第一个余数,这个二进制数就是转换的结果。

2.浮点数的小数部分转为二进制的方法

小数部分乘2取整,取整后剩余的小数部分继续乘2取整,一直取到小数部分为0为止,如果一直不为0,按照要求保留小数的位数,根据保留位数后第一位是0还是1取舍,若为0则舍去,若为1则进位,从第一个取整的数读到最后一个取整的数这个二进制数就是转换的结果。

三、示例

:将11.375转换为IEEE754标准的32位浮点数的二进制存储格式。
对于整数部分11
第一步:11 / 2 = 5 余 1
第二步:5 / 2 = 2 余 1
第三步:2 / 2 = 1 余 0
第四步:1 / 2 = 0 余 1
结果:1011

对于小数部分0.375
第一步:0.375 * 2 = 0.750,取整数:0,小数部分为:0.750
第二步:0.750 * 2 = 1.500,取整数:1,小数部分为:0.500
第三步:0.500 * 2 = 1.000,取整数:1,小数部分为:0
结果:011

综合整数和小数的转换结果,则这个浮点数的二进制数为:1011.011

结合上面对S、E和M的介绍,下面在这个例子中解释三个参数的作用:

  1. 首先这是个整数,故S为0;
  2. 将1011.011移位成1.M的形式:1.011011,则M为:0110110 00000000 00000000(共23个bit)
  3. 相比1011.011与1.011011,可知e为3,而E为3+127=130,转为二进制数为:1000 0010(共8个bit)

故可知11.375在计算机中的存储格式为:0 1000 0010 0110110 00000000 00000000

现按照上面提到的公式求该二进制数的十进制数:
f32 = (-1)^S * (1.M) * 2^e = (-1) ^ 0 * (1.01101100000000000000000) * 2 ^ 3 = 1 * 1011.011(二进制) = 11.375(十进制)

程序验证(C语言)

#include <iostream>

using namespace std;

void print_binary(void *addr, size_t size)
{
	unsigned char* ptr = (unsigned char*)addr;
	char out[256] = { 0 };
	int len = 0;
	printf("Hex: ");
	for (size_t byte_idx = size; byte_idx > 0; --byte_idx)
	{
		unsigned char byte = *(ptr + byte_idx - 1);
		printf("%02x ", byte);
		for (char bit_idx = 7; bit_idx >= 0; --bit_idx)
		{
			int bit = (byte >> bit_idx) & 1;
			len += snprintf(out + len, sizeof(out) - len - 1, "%d", bit);
		}
		len += snprintf(out + len, sizeof(out) - len - 1, " ");
	}
	printf("\nbinary:%s\n", out);
}

int main(int argc, char *argv[])
{
	float f32 = 11.375f;
	print_binary(&f32, sizeof(f32));
	return 0;
}

运行结果
在这里插入图片描述
由运行结果可知,程序输出结果与我们推到的结果一致。

这里是引用
原文链接:https://blog.csdn.net/u013416923/article/details/121711879

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值