浮点数的二进制表示

news2024/9/23 18:25:04

浮点数的二进制表示

       浮点数在C/C++中对应 float 和 double 类型,我们有必要知道浮点数在计算机中实际存储方式。

IEEE754规定:

       单精度浮点数字长32位,尾数长度23,指数长度8,指数偏移量127;双精度浮点数字长64位,尾数长度52,指数长度11,指数偏移量1023;约定小数点左边隐含有一位,通常这位数是1,所以上述单精度尾数长度实际为24(默认省略小数点左边的1则为23),双精度尾数长度实际为53(默认省略小数点左边的1则为53)。

知识点一:

IEEE754 单精度(32位)的二进制排列规则:符号位S(1位,0为正数,1为负数) + 阶码E(8位)  + 尾数M(23位)。

IEEE754 双精度(64位)的二进制排列规则:符号位S(1位,0为正数,1为负数) + 阶码E(11位)  + 尾数M(52位)。

知识点二:

单精度的偏置常数为127(固定值),阶码 = 127 + 阶(左移为正数,右移为负数)。

双精度的偏置常数为1023(固定值),阶码 = 1023 + 阶(左移为正数,右移为负数)。

一、float 单精度浮点数

        IEEE754 标准中规定 float 单精度浮点数在机器中用32位表示,其中用 1 位表示数字的符号,用 8 位来表示指数,用23 位来表示尾数,即小数部分

一个由IEEE745制的32位浮点数由三部分组成

组成部分位数含义
符号位1位0为正,1为负
指数位2~9位类比十进制的科学计数法,此处以2为底,指数位为幂。注意还需要加上127的偏移量
尾数位10~32位省略了1. 实际为1.(尾数位),类似小数的二进制写法

核心逻辑:

 这种设计允许浮点数以不同的精度级别覆盖广泛的值。用于这种表示的公式是:

二、double 双精度浮点数

       对于 double 双精度浮点数在机器中用64位表示,其中,用 1 位表示符号,用 11 位表示指数,52 位表示尾数,其中指数域称为阶码。

       在各种数据类型中,浮点数能够以高精度表示各种值。通常,浮点数使用n位来存储数值。这些 n 位 进一步分为三个不同的组成部分:

  • 符号:符号位指示数字的正数或负数。它使用一位,其中 0 表示正数,1 表示负数。
  • 指数:指数是一段位,表示基数(在二进制表示中通常为 2)的幂。指数也可以是正数或负数,允许数字表示非常大或非常小的值。
  • 有效数/尾数:剩余位用于存储有效数,也称为尾数。这代表数字的有效数字,表示精确度。数字的精度在很大程度上取决于有效数字的长度。

  • float 类型可以表示正零值和负零值
  • mantissa从左到右第N位表示2-N,例如1.5的二进制表示。

int64与相等float64的二进制关联

二进制数值

0000 0000 0000 0000 0000 0000 0000 0000

0000 0000 0000 0000 0000 0010 0010 1011

555

0100 0000 1000 0001 0101 1000 0000 0000

0000 0000 0000 0000 0000 0000 0000 0000

555.0

       int64 最高非零位以后的二进制位 === float64 mantissa,所以float64可以不损失精度表示的最大 int64 范围是-253 ~ 253,253+1就没法表示了。然而,诸如253+2一类的 int64 仍然可以不损失精度地用 float64 表示。

例1:将十进制数 33.758 转换为IEEE754的单精度浮点数格式表示

步骤①:将整数部分整除以2,取余数部分倒序排列

       33 / 2 = 16   余数为1

       16 / 2 = 8     余数为0

         8 / 2   = 4    余数为0  

         4 / 2  = 2     余数为0

         2 / 2 = 1      余数为0

         1 / 2 = 0       余数为1

      得到整数部分二进制为 1000 01

步骤②:将小数部分乘以2,取商的整数部分正序排列

( 一直乘 2 ,遇到 1 退出;如果乘 2 之后的数字大于 1,则减去 1 )

     0.758 * 2 = 1.516   取商的整数部分1    1.516 - 1 = 0.516      

     0.516 * 2 = 1.032   取商的整数部分1    1.032 - 1 = 0.032       

     0.032 * 2 = 0.064    取商的整数部分0

     0.064 * 2 = 0.128    取商的整数部分0

     0.128 * 2 = 0.256    取商的整数部分0

     0.256 * 2 = 0.512    取商的整数部分0 

     0.512 * 2 = 1.024    取商的整数部分1   1.024 - 1 = 0.024

     0.024 * 2 = 0.048    取商的整数部分0

     0.048 * 2 = 0.096    取商的整数部分0

     0.096 * 2 = 0.192    取商的整数部分0

    0.096 * 2  = 0.384    取商的整数部分0

    0.384 * 2 = 0.768     取商的整数部分0

    0.768 * 2 = 1.536     取商的整数部分1   1.536 - 1 = 0.536

    0.536 * 2 = 1.072     取商的整数部分1   1.072 - 1 = 0.072

    0.072 * 2 = 0.144     取商的整数部分0

    0.144 * 2 = 0.288     取商的整数部分0

    0.288 * 2 = 0.576     取商的整数部分0

    0.576 * 2 = 1.152     取商的整数部分1    1.152 - 1 = 0.152

    0.152 * 2 = 0.304     取商的整数部分0

       尾数可以取23位,但因小数点后第一位"1"不显式地表示出来,这样可用23位来表示24位尾数,因前面整数已经占6位,则小数部分只能取18位,即1100 0010 0000 1100 01

故33.758转换为二进制为:1000 01.1100 0010 0000 1100 01

步骤③:小数点向左移,直到整数部分为1,即1.00001110000100000110001 * 2 ^ 5

      至此得到阶为5,阶码 = 5 + 127 = 132   转换成二进制为1000 0100,即阶码E = 1000 0100,尾数M为1.后面的数,即:0000 1110 0001 0000 0110 001    

步骤④:根据数值的正负定义符号位

     33.758 > 0 所以符号位S为0

步骤⑤:根据知识点一进行数值组装

得到IEEE754的单精度浮点数格式为

符号位S(1位,0为正数,1为负数)   +     阶码E(8位)   +       尾数M(23位)

                              0                              1000 0100              0000 1110 0001 0000 0110 001

例2:将用IEEE754二进制表示的32位浮点数转成它所表示的十进制数

参考:

IEEE754介绍

IEEE754解析方法

关于IEEE754单精度(32位)的计算步骤(超详细)_ieee754标准计算公式-CSDN博客

模型量化2:最常用的数据类型:float32 (FP32)、float16 (FP16) 、 bfloat16 (BF16)【IEEE754制32位浮点数转换为十进制】-CSDN博客

十进制转二进制定点小数MATLAB代码_matlab如何把十进制转为位数可控的二进制小数-CSDN博客

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

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

相关文章

Yarn UI 时间问题,相差8小时

位置 $HADOOP_HOME/share/hadoop/yarn/hadoop-yarn-common-2.6.1.jar 查看 jar tf hadoop-yarn-common-2.6.1.jar |grep yarn.dt.plugins.js webapps/static/yarn.dt.plugins.js 解压 jar -xvf hadoop-yarn-common-2.6.1.jar webapps/static/yarn.dt.plugins.js inflated: we…

mybatis-plus中出现Field ‘id‘ doesn‘t have a default value问题解决方法

问题分析: 出现这个原因,主要是因为mybatis-plus自身查询的特性,因为查询都是它自己内部设定好的参数,一般为了简便,都会默认自己底层的数据库对应的主键id字段是自增的,也就是mybatis-plus认为不需要id,每…

【Git】.gitignore全局配置与忽略匹配规则详解

设置全局配置 1)在C:/Users/用户名/目录下创建.gitignore文件,在里面添加忽略规则。 如何创建 .gitignore 文件? 新建一个.txt文件,重命名(包括后缀.txt)为 .gitignore 即可。 2)将.gitignore设…

Eagle平替?免费超强的素材管理神器!支持多级标签,满足素材快速收集!

作为设计师,你是不是下载了很多类型的素材资源,然而要每次使用的时候,还要通过文件夹一级一级去翻找,非常麻烦!还好我找到了一款好用的素材管家神器—千鹿设计助手,如果你之前有用过Eagle或者BillFish的话&…

华为od机试真题:求字符串所有整数最小和(Python)

2024华为OD机试(C卷D卷)最新题库【超值优惠】Java/Python/C合集 题目描述 1.输入字符串s输出s中包含所有整数的最小和,说明:1字符串s只包含a~z,A~Z,,-, 2.合法的整数包括正整数,一个或者多个0-9组成&…

归并排序 python C C++ 图解 代码 及解析

一,概念及其介绍 归并排序(Merge sort)是建立在归并操作上的一种有效、稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列&#xff…

大厂linux面试题攻略三之Shell编程

一、Shell编程文本截取类 1.有一个b.txt文本(内容如下),要求将所有域名截取出来,并统计重复域名出现的次数 http://www.baidu.com/index.html https://www.atguigu. com/index.html http://www.sina.com.cn/1024.html …

二百四十八、Linux——删除/etc/.sudoers文件进程或修改/etc/.sudoers文件内容

一、目的 安装国产化数据库OceanBase的时候,需要创建用户,并在/etc/.sudoers文件中赋予用户root权限 二、删除/etc/.sudoers文件进程 1 报错 W10: Warning: Changing a readonly file E325: ATTENTION Found a swap file by the name "/etc/.su…

二叉树的性质证明

文章目录 二叉树的概念二叉树的性质1. 若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有 2 i − 1 2^{i-1} 2i−1 个结点.2. 若规定根结点的层数为1,则深度为h的二叉树的最大结点数是 2 h − 1 2^h-1 2h−1.3. 对任何一棵二叉树, 如果度为0其叶结…

C++:函数模板与类模板详解

1.函数模板 在构造函数的时候,我们常常会考虑传入的参数的数据类型,比如我们写一个大小比较的函数mycmp(class1 a,class1 b),则可以写出class1为int,float,double,string等各个种类的mycmp函数,这样会很麻烦,且当我们…

hot100-7-链表1

160相交链表 206反转链表 234回文链表 可以反转后半部分链表或者反转全部链表,然后对比输出 141环形链表 142环形链表2

大模型RAG入门及实践

前言 在大语言模型(LLM)飞速发展的今天,LLMs 正不断地充实和改进我们周边的各种工具和应用。如果说现在基于 LLM 最火热的应用技术是什么,检索增强生成(RAG,Retrieval Augmented Generation)技…

【JVM】JVM的组成与执行流程

JVM 由哪些部分组成,运行流程是什么? JVM 是什么 Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写,到处运行自动内存管理,垃圾回收机制 JVM的组成 我…

redis集群 高可用

目录 主从复制 主从复制的流程 部署主从复制 步骤 哨兵模式 数据流向 步骤 故障恢复 cluster集群 数据流向 步骤 redis集群的三种模式: 主从复制 奇数台 1主2从 哨兵模式 奇数台 1主2从 cluster 集群 6 台 主从复制 原理:主可以…

(四)延时任务篇——redisson实现延迟任务实战

前言 上一节内容中介绍了如何使用redis的zset结构实现延迟任务的实战内容,从使用角度来说还是略显繁琐,而且定时任务的方式扫描redis获取过去的任务也会存在任务空转的问题。在此基础上,我们可以使用redisson的阻塞队列,完成延迟…

探索 Python 的新世界:funcy 库的神奇之旅

文章目录 探索 Python 的新世界:funcy 库的神奇之旅背景:为何 funcy 如此迷人?简介:funcy 库是什么?安装:如何将 funcy 纳入你的项目?功能:funcy 的五大法宝应用:funcy 在…

图方法与机器学习实战:从理论到应用的全景指南

《动手学图机器学习》并不是一本纯粹介绍图机器学习理论的著作,Alessandro Negro 博士作为科学家和 Reco4 公司的 CEO,长期维护图数据源的推荐系统。他结合机器学习工程和图机器学习方法,通过推荐引擎、欺诈检测和知识图谱等案例,…

一键式RWKV RAG、RWKV-Keras、新论文...RWKV社区7月动态速览!

大家好,《RWKV 社区最新动态》迎来了第三期内容,本期统计了 RWKV 社区 7 月的重要动态,一起来看看吧! 省流版本: RWKV 官方公告 RWKV-6-World 14B 模型已发布RWKV 中文官网 rwkv.cn 正式上线 RWKV 社区新项目 RWKV R…

LeetCode删除链表的倒数第 N 个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 示例 2: 输入:head [1], n 1 输出:[] 示例 3&#x…