C语言中32位浮点数的格式

news2024/9/20 18:54:19

GNU C为例,它遵循 IEEE 754-2008标准中制定的浮点表示规范。在该规范中定义了 5种不同大小的基础二进制浮点格式,包括:16位,32位,64位,128位,256位。其中,32位的格式被用作标准 C类型的 float64位的格式被用作标准 C类型的 double128位的格式被用作标准 C类型的 long double

每种浮点格式都由三部分组成,包括:1个比特的符号位、若干比特的指数位、若干比特的小数位,如下图所示:
浮点格式

C语言中 float类型(32位浮点)为例,它的符号位占 1位,指数位占 8位,小数位占 23位,如下图所示:
C语言float类型格式

值得注意的是,
1)指数位编码的指数以 2为底数,若要表示很小的数,例如 1/(2^n) == 2^(-n),则指数位会出现负数 (-n),那么还需要专门的符号位来表示,因此指数位是以 127为偏移的,也就是说,一个数在用浮点数来表示时,其指数位的值是实际指数值加上 127。对于 64位浮点数,它的指数位是 11个比特,以 1023为偏移。
2)浮点数的小数部分是将该浮点数表示为 2^n * 1.m后,0.m那部分的数值,也就是说,整数部分始终是 1,且被忽略了(不用保存),这样就能省出一位来表示更高的精度。

举例来说,
1)0.5 = 2^(-1) * 1.0,其指数位为 (-1 + 127),小数位为 0.0,其二进制是:0 01111110 00000000000000000000000,也就是 0x3F000000
2)5 = 2^(2) * 1.25,其指数位为 (2 + 127),小数位为 0.25,其二进制是:0 10000001 01000000000000000000000, 也就是 0x40A00000

测试代码如下:

#include <stdio.h>

int main(void)
{
	float a = 0.5;
	unsigned int *b = (unsigned int*)&a;

	printf("b = 0x%X\n", *b);

	a = 5;
	printf("b = 0x%X\n", *b);
}

程序运行结果如下:

$ gcc -o main main.c 
$ ./main 
b = 0x3F000000
b = 0x40A00000

32位浮点的指数宽度来看,理论上,它可以表示很大的数,比如:2^(128) * 1.9999999,这比我们 32位整型能表示的范围(2^(32) - 1)大的多,但受限于浮点小数位的宽度,有些 32位整型数是无法用浮点数来表示的,也就是会出现空洞,原因是浮点数的小数部分精度有限,当小数部分比 1/(2^23)还小时,就无法准确表示该整型数,例如:2^(24) + 1这个数用 32位整型来表示是没有问题的,但用 32位浮点来表示,则会被舍入为:2^24

测试代码如下:

#include <stdio.h>

int main(void)
{
	float a = 1 << 24;
	unsigned b = 1 << 24;
	printf("a = %f, b = %u\n", a, b);

	a += 1;
	b += 1;
	printf("a = %f, b = %u\n", a, b);

	return 0;
}

程序运行结果如下:

$ gcc -o main main.c
$ ./main 
a = 16777216.000000, b = 16777216
a = 16777216.000000, b = 16777217

参考资料:

  1. https://www.gnu.org/software/c-intro-and-ref/manual/html_node/Floating-Representations.html
  2. https://docs.nvidia.com/cuda/floating-point/index.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1904595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于PSOGWO-CNN-BiLSTM数据回归预测(多输入单输出)-粒子群结合灰狼算法优化-CNN-BiLSTM

基于PSOGWO-CNN-BiLSTM数据回归预测(多输入单输出)-粒子群结合灰狼算法优化-CNN-BiLSTM 1.数据均为Excel数据&#xff0c;直接替换数据就可以运行程序。 2.所有程序都经过验证&#xff0c;保证程序可以运行。 3.具有良好的编程习惯&#xff0c;程序均包含简要注释。 获取方式…

恢复出厂设置后如何从 iPhone 恢复数据

在 iPhone 恢复出厂设置后&#xff0c;所有数据都会被删除&#xff0c;并且 iPhone 将恢复到原始出厂设置&#xff0c;这意味着您的所有 iPhone 数据&#xff0c;包括照片、视频、联系人和应用程序都将消失。 幸运的是&#xff0c;如果您有备份可以恢复&#xff0c;这并不一定…

JavaSe系列二十七: Java正则表达式

正则表达式 为什么要学习正则表达式再提几个问题解决之道-正则表达式正则表达式基本介绍介绍 正则表达式底层实现实例分析 正则表达式语法基本介绍元字符-转义号 \\\\元字符-字符匹配符元字符-选择匹配符元字符-限定符元字符-定位符分组非贪婪匹配 应用实例对字符串进行如下验证…

cloudflare tunnels tcp

这里是官网的说明Cloudflare Tunnel Cloudflare Zero Trust docs 根据实际情况安装环境 tunnels除了http,https协议是直接暴露公网&#xff0c;tcp是类似ssh端口转发。 在需要内网穿透的局域网找一条机子部署代理 我这边是window cloudflared tunnel login #生成一个身份校…

【论文阅读】-- Visual Analytics for Model Selection in Time Series Analysis

时间序列分析中模型选择的可视化分析 摘要1 引言2 相关工作3 问题表征3.1 Box-Jenkins 方法论3.2 ARIMA 和季节性 ARIMA 模型3.3 模型规范3.4 模型拟合3.5 模型诊断 4 需求分析5 VA 用于时间序列分析中的模型选择5.1 VA选型流程说明5.2 TiMoVA 原型5.2.1 实施选择5.2.2 图形用户…

(详细版)学生管理系统(姓名、成绩、学号)---顺序表

//1:创建顺序表 //2:判满 //3:判空 //4:插入学生信息 //5:输出学生信息 //6:按位置插入学生信息 //7:按位置删除学生信息 //8:按位置修改学生信息 //9:按学号查找学生信息 //10:顺序表去重 //11:销毁顺序表 main.c&#xff1a; int main(int argc, const char *argv[]) {seq_p…

第一周周日总结

题目总结 1.给你一个整数数组 hours&#xff0c;表示以 小时 为单位的时间&#xff0c;返回一个整数&#xff0c;表示满足 i < j 且 hours[i] hours[j] 构成 整天 的下标对 i, j 的数目。 整天 定义为时间持续时间是 24 小时的 整数倍 。 例如&#xff0c;1 天是 24 小时…

DHCP的原理及配置

目录 一、了解DHCP服务 1.什么是DHCP 1.1DHCP广播 2.使用DHCP的好处 2.1为什么使用DHCP 3.DHCP的模式与分配方式 3.1分配方式 3.2模式 二、DHCP工作原理 1.四次回话 2.重新登录 3.更新租约 4.扩展 三、安装DHCP服务 四、DHCP局部配置并且测试 五、使用…

PyQt5中如何实现指示灯点亮和指示灯熄灭功能

一般上位机界面都会涉及指示灯点亮和指示灯熄灭功能&#xff0c;从网上下载该功能的上位机界面&#xff0c;学习如何使用PyQt5搭建具备指示灯点亮和指示灯熄灭效果的界面。 1. 上位机界面的效果展示 使用PyQt5实现以下界面&#xff0c;界面效果如下&#xff0c;界面图片是从网…

【CUDA】

笔者在学习Softmax实现时遇到了一个问题&#xff0c;很多文章直接将softmax的计算分成了五个过程&#xff0c;而没有解释每个过程的含义&#xff0c;尤其是在阅读这篇文章时&#xff0c;作者想计算最基本的softmax的效率&#xff0c;以展示可行的优化空间&#xff1a; 贴一个g…

相见恨晚的《新程序员》 AI 专辑

声明&#xff1a;本文并不什么“软文”&#xff0c;是我的真实感受分享。本人和《新程序员》无任何利益关系&#xff0c;读者购买专栏我不会获得任何分成。 一、前言 前不久有位朋友送我一本 CSDN 出品的 《新程序员 006&#xff1a;人工智能新十年》 的杂志。 说实话&#x…

昇思25天学习打卡营第12天|FCN图像语义分割

文章目录 昇思MindSpore应用实践基于MindSpore的FCN图像语义分割1、FCN 图像分割简介2、构建 FCN 模型3、数据预处理4、模型训练自定义评价指标 Metrics 5、模型推理结果 Reference 昇思MindSpore应用实践 本系列文章主要用于记录昇思25天学习打卡营的学习心得。 基于MindSpo…

谷粒商城学习笔记-16-人人开源搭建后台管理系统

文章目录 一&#xff0c;克隆前/后端代码1&#xff0c;克隆前端工程renren-fast-value2&#xff0c;克隆后端工程renren-fast 二&#xff0c;集成后台管理系统的后端代码三&#xff0c;启动后台管理系统四&#xff0c;前端系统的安装和运行1&#xff0c;下载安装VSCode2&#x…

【TB作品】51单片机 Proteus仿真 超声波LCD1602ADC0832 身高体重测量仪

00024 超声波LCD1602ADC0832 实验报告&#xff1a;基于51单片机的身高体重测量仪设计 背景介绍 本实验设计并实现了一个基于51单片机的身高体重测量仪。该系统利用超声波传感器测量高度&#xff0c;通过ADC0832模数转换芯片获取重量数据&#xff0c;并使用LCD1602显示屏显示…

26_嵌入式系统网络接口

以太网接口基本原理 IEEE802标准 局域网标准协议工作在物理层和数据链路层&#xff0c;其将数据链路层又划分为两层&#xff0c;从下到上分别为介质访问控制子层(不同的MAC子层&#xff0c;与具体接入的传输介质相关),逻辑链路控制子层(统一的LLC子层&#xff0c;为上层提供统…

【JavaSE复习】数据结构、集合

JavaSE 复习 1.数据结构1.1 查找1.1.1 基本查找1.1.2 二分查找1.1.3 插值查找1.1.4 斐波那契查找1.1.5 分块查找1.1.6 分块查找的扩展&#xff08;无规律数据&#xff09; 1.2 排序1.2.1 冒泡排序1.2.2 选择排序1.2.3 插入排序1.2.4 快速排序 2. 集合2.1 基础集合2.1.1 集合和数…

MATLAB制作一个简单的函数绘制APP

制作一个函数绘制APP&#xff0c;输入函数以及左右端点&#xff0c;绘制出函数图像。 编写回调函数&#xff1a; 结果&#xff1a;

D1.排序

1.快速排序 双指针 采用分治的思想&#xff0c;基于一个数作为标准&#xff0c;进行分治 步骤&#xff1a; 确定分界点的值。x q[l]、q[(lr)/2]、q[r]、随机 都可以&#xff1b;划分区间&#xff1a;使得小于等于x的数放在数组的左边&#xff1b;大于等于x的数放在数组的右边…

【C语言】 —— 编译和链接

【C语言】 —— 编译和链接 一、编译环境和运行环境二、翻译环境2.1、 预处理2.2、 编译&#xff08;1&#xff09;词法分析&#xff08;2&#xff09;语法分析&#xff08;3&#xff09;语义分析 2.3、 汇编2.4、链接 三、运行环境 一、编译环境和运行环境 平时我们说写 C语言…

【电机控制】EG2134无刷电机驱动、控制一体板——开环、无感SMO验证

【电机控制】EG2134无刷电机驱动、控制一体板——开环、无感SMO验证 文章目录 前言一、硬件二、软件三、开环SVPWM四、SMO无感观测器闭环控制五、参考文献总结 前言 【电机控制】直流有刷电机、无刷电机汇总——持续更新 【电机控制】EG2134无感FOC驱控一体板-滑模观测器 使用…