浮点数的二进制表示

浮点数的二进制表示

       浮点数在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.rhkb.cn/news/387744.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

达梦数据库DPI 实现两个数据库数据互通

链接字符串是目标访问链接 目标访问用户名 口令实现 31 里访问33库的数据 如果在31上建立视图访问33的某个表 AS SELECT SZZJ.sys_user.id FROM SZZJ.sys_userszzj31_szzj33;

研0 冲刺算法竞赛 day25 P1223 排队接水

P1223 排队接水 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 考点&#xff1a;贪心算法 思路&#xff1a;很简单&#xff0c;快的先接水即可&#xff0c;要注意重复项 代码: #include<iostream> #include<algorithm> using namespace std;int arr[1000005];…

C语言进阶 10. 字符串

C语言进阶 10. 字符串 文章目录 C语言进阶 10. 字符串10.1. 字符串10.2. 字符串变量10.3. 字符串输入输出10.4. 字符串数组10.5. 单字符输入输出10.6. 字符串函数strlen()10.7. 字符串函数strc()10.8. 字符串函数strcpy()10.9. 字符串搜索函数10.10. PAT10-0. 说反话 (20)10-1.…

七天打造一套量化交易系统:Day6-人工智能在量化投资中的应用

七天打造一套量化交易系统&#xff1a;Day6-人工智能在量化投资中的应用 步骤一&#xff1a;数据获取步骤二&#xff1a;对股票样本进行初步处理步骤三&#xff1a;遗传算法选股遗传算 kmeans 类的主要代码 步骤四&#xff1a;回测结果 遗传算法是一种基础的人工智能算法&#…

CSS实现图片边框酷炫效果

一、前言 我们在浏览一些网页时&#xff0c;经常会看到一些好看酷炫的元素边框效果&#xff08;如下图&#xff09;&#xff0c;那么这些效果是怎么实现的呢&#xff1f;我们知道&#xff0c;一般的边框&#xff0c;要么是实线&#xff0c;要么是虚线&#xff08;点状&#xf…

快速识别音频文件转成文字

一、SenseVoice概述 阿里云通义千问开源了两款语音基座模型 SenseVoice&#xff08;用于语音识别&#xff09;和 CosyVoice&#xff08;用于语音生成&#xff09;。 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测&#xff0c;有以下特点&#xff1a; 多语言…

spark 3.0.0源码环境搭建

环境 Spark版本&#xff1a;3.0.0 java版本&#xff1a;1.8 scala版本&#xff1a;2.12.19 Maven版本&#xff1a;3.8.1 编译spark 将spark-3.0.0的源码导入到idea中 执行mvn clean package -Phive -Phive-thriftserver -Pyarn -DskipTests 执行sparksql示例类SparkSQLExam…

机器学习算法——常规算法,在同的业务场景也需要使用不同的算法(二)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

麒麟V10系统统一认证子系统国际化

在适配麒麟V10系统统一认证子系统国际化过程中&#xff0c; 遇到了很多的问题&#xff0c;关键是麒麟官方的文档对这部分也是粗略带过&#xff0c;遇到的问题有: &#xff08;1&#xff09;xgettext无法提取C源文件中目标待翻译的字符串。 &#xff08;2&#xff09;使用msgf…

rhce THE homework of first

ssh远程免密登录成功 下载httpd和nginx 关闭防火墙 查看selinux的状态 为服务器配置ip 填充网站的内容 添加服务器配置 将文本写入网站

testRigor-基于人工智能驱动的无代码自动化测试平台

1、testRigor介绍 简单来说&#xff0c;testRigor是一款基于人工智能驱动的无代码自动化测试平台&#xff0c;它能够通过分析应用的行为模式&#xff0c;智能地生成测试用例&#xff0c;并自动执行这些测试&#xff0c;无需人工编写测试脚本。可以用于Web、移动、API和本机桌面…

C#基础——类、构造函数和静态成员

类 类是一个数据类型的蓝图。构成类的方法和变量称为类的成员&#xff0c;对象是类的实例。类的定义规定了类的对象由什么组成及在这个对象上可执行什么操作。 class 类名 { (访问属性) 成员变量; (访问属性) 成员函数; } 访问属性&#xff1a;public&#xff08;公有的&…

微前端技术预研 - bit初体验

1.关于什么是微前端以及微前端的发展&#xff0c; 当前主流框架以及实现技术等&#xff0c;可参考这篇总结(非常全面)&#xff0c; 微前端总结&#xff1a;目录详见下图 本文内容主要针对bit框架的实时思路以及具体使用。 1.什么是Bit? &#xfeff;Bit 是可组合软件的构建…

pycharm怎么使用Anaconda和配置

打开Anaconda Prompt 要删除 Conda 环境 yolov5sconda&#xff0c;你可以使用以下命令&#xff1a; conda remove --name yolov5sconda --all这个命令会删除名为 yolov5sconda 的整个环境&#xff0c;包括其中安装的所有包和依赖项。请在命令提示符或终端中运行此命令。执行此…

使用Spring Boot与Spire.Doc实现Word文档的多样化操作

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 前言 使用Spring Boot与Spire.Doc实现Word文档的多样化操作具有以下优势&#xff1a; 强大的功能组合&#xff1a;Spring Boot提供了快速构建独立和生产级的Spring应用程序的能力&#xff0c;而Spire.Doc则…

基于Hadoop的服装电商数据分析系统【Hdfs、flume、HIve、sqoop、MySQL、echarts】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍总体研究方向数据集介绍配置flume文件HIve建表HIveSQL大数据分析MySQL建表Sqoop命令导出数据到MySQL数据可视化店铺销售情况.......等 总结每文一语 有需要本项目的代码或文档以及全…

UDP服务器端bind失败问题

本人使用microchip芯片开发&#xff0c;使用UDP虚拟机通讯&#xff0c;经常提示bind失败&#xff0c;返回-1&#xff0c;尝试了以前UDP作为客户端使用时正常&#xff0c;故硬件链路没问题。 一、可能有几个原因&#xff1a; 端口实际上被占用&#xff1a;最明显的原因是端口真…

短视频矩阵系统搭建教程,源码获取,部署上线指南

目录 一、短视频矩阵是什么&#xff1f; 二、搭建教程 1、前端界面开发 2、后端架构搭建 3、第三方视频平台对接 三、部分代码展示 一、短视频矩阵是什么&#xff1f; 短视频矩阵系统是一种集成了多元短视频平台功能的综合性管理工具&#xff0c;它汇聚了多个视频发布渠…

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

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