浮点数在计算机中的编码方式

news2024/12/27 11:42:14

一、前言

我们常能听到,直接用浮点数做运算得出的结果是不准确的了;或者也能看到涉及到浮点数时,会出现一些奇奇怪怪的问题,比如:

public class DecimalTest {
    public static void main(String[] args) {
        float f1 = 1.2002f;
        float f2 = 100000.2002f;
        System.out.println(f1);
        System.out.println(f2);
    }
}

=============
输出:
1.2002
100000.2

那么这些现象的底层原理是什么呢?这需要从浮点数在计算机中的编码方式说起。

二、IEEE浮点标准

表示方式

IEEE浮点标准是广泛使用的浮点数编码方式,其用下面的方式表示一个数(和10进制的科学计数法是几乎相同的):

V=(-1)^{s}*M*2^{E}

  • 符号位 s,s = 0为正数,s = 1为负数
  • 尾数 M,一个二进制小数,取值范围一般为 [1,2)
  • 阶码 E,表示 2 的 E 次幂
储存方式

在实际存储浮点数时,M和E做了些特殊的编码处理,下面以32位的单精度浮点数为例(即编程语言中的float)。

  • 31位的 s 部分:符号位 s,s = 0为正数,s = 1为负数
  • 30-23位的 exp 部分:由阶码 E 转换而来,转换方式(其中 k 为此部分的 bit 数,即8):
    e(编码值) = Bias(偏移量) + E(阶码) = 2^(k-1) - 1 + E = 127 + E
  • 22-0位的 frac 部分:M 的小数部分,即 M-1

补充说明:

  • 上述为常用的“规格化的值”的实现方式,实际上完整的IEEE标准包括 规格化的值、非规格化的值、特殊值3种情况
  • 三种情况通过 exp 部分既不全为0也不全为1、全为0、全为1进行区分
  • 规格化的值用于表示普通常用的值,非规格化的值用于表示非常接近于0的数,特殊值用于表示无穷、非合法数字等情况

三、开头的问题

为什么 100000.2002f 写入 float 后,发生精度丢失变成了 100000.2?

  1. 100000.2002 的二进制原码为 11000011010100000.001100110100000001......
  2. 转成 IEEE 编码,V=(-1)^{0}*1.1000011010100000001100110100000001...*2^{16}
  3. 即s=0,exp=127+16=143=10001111,farc=10000110101000000011001(1)=10000110101000000011010(向偶数舍入)。
  4. 最终的编码为:0-10001111-10000110101000000011010,对应的数值为:1.10000110101000000011010*2^16 = 11000011010100000.0011010 = 10000.203125

四、其他

  • 快速判别一个小数是否可被二进制精确表示:该小数是否可表示为以 2^{n} 为分母的分数
  • 主要参考资料:《深入理解计算机系统》第二章,2.4

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

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

相关文章

STK12.2+Python开发(二):添加访问约束,新建场景、卫星、地面站等,获取当前场景的信息

新建场景 1.获取当前打开的场景 #获取当前打开的场景 scenario root.CurrentScenario2.设置当前场景的时间 scenario.SetTimePeriod(Today,24hr)3.添加一个地面目标到当前的场景 scenario.SetTimePeriod(Today,24hr)4.添加一个地面目标到当前的场景,括号内是三…

空气质量传感器 - 从零开始认识各种传感器【二十八期】

空气质量传感器|从零开始认识各种传感器 1、什么是空气质量传感器? 空气质量传感器是一种检测空气中污染物浓度的设备,广泛应用于环境监测、智能家居、工业控制和健康管理等领域。 2、空气质量传感器是如何工作的? 对于每个人都关心的空气质…

效率何止10倍!利用输入法瞬间调用提示词

我们在日常工作/学习/生活有很多场景需要使用提示词,比如说: 快速总结文章快速排版解释概念翻译其它经常面对的任务 但是使用提示词有几个痛点: 你很难临时写一个非常完整的提示词你凑合写的提示词,又担心结果不满意如果已经保…

前端使用css动画绘制简易的进度条,数据多条的时候可以切换

文章目录 一、效果图二、使用步骤1.公共的进度条组件2.使用 总结 一、效果图 二、使用步骤 1.公共的进度条组件 我这里命名的progressBar.vue&#xff0c; 你们使用的时候直接复制粘贴到自己的项目里面即可。 文件中代码如下&#xff08;示例&#xff09;&#xff1a; <t…

EasyX 碰撞检测

代码&#xff1a; #define _UNICODE #define UNICODE#include <array> #include <cmath> #include <ctime> #include <format> #include <graphics.h> #include <vector>typedef struct tagRECTF {double left;double top;double right;d…

You Only Look Once:Unified, Real-Time Object Detection 论文阅读

论文名&#xff1a;You Only Look Once:Unified, Real-Time Object Detection 论文作者&#xff1a;Joseph Redmon et.al. 期刊/会议名&#xff1a;CVPR 2016 发表时间&#xff1a;2016-5 ​论文地址&#xff1a;https://arxiv.org/pdf/1506.02640 1.摘要 我们提出了一种新的目…

论文辅导 | 结合变种残差模型和 Transformer 的城市公路短时交通流预测

辅导文章 模型描述 城市公路交通流的预测受到历史交通流量和相邻车道交通流量的影响&#xff0c;蕴含了复杂的时空特征。针对传统交通流预测模型卷积长短时记忆网络(ConvLSTM)进行交通流预测时&#xff0c;未将时空特征分开提取而造成的提取不充分、特征信息混淆和特征信息缺失…

视频融合技术

三维视频融合技术遵循数字孪生多源数据融合的原则&#xff0c;比视频窗口、矩阵更加直观高效&#xff0c;省去了人脑理解空间的时间&#xff0c;可有效提升数字孪生城市在物联感知操作、虚实融合交互等方面的能力&#xff0c;动静一体、虚实结合&#xff0c;让三维场景“动起来…

常见的SQL注入

联合查询 如下&#xff0c;要求我们传入一个id值过去。传参?id1&#xff0c;当我们输入id1和id2时&#xff0c;页面中name值和password的值会发生变化&#xff0c;说明此时我们输入的数据和数据库有交互并且将数据显示在屏幕上了 输入?id1&#xff0c;页面发生报错&#xf…

手机联网如何设置动态ip

在现代社会&#xff0c;手机已成为我们日常生活中不可或缺的一部分&#xff0c;无论是工作、学习还是娱乐&#xff0c;都离不开网络的支持。而在手机联网的过程中&#xff0c;IP地址的分配方式显得尤为重要。动态IP地址因其灵活性和安全性&#xff0c;成为了许多用户的首选。那…

电子合同怎么制作?9款常用电子合同软件

文章将介绍了以下9个工具&#xff1a;e签宝、文书宝、签通云、快签宝、法天使、Zycus iContract、airSlate WorkFlow、Lightico、KeepSolid Sign。 在数字化快速发展的今天&#xff0c;电子合同成为了业务操作中不可或缺的一部分&#xff0c;但许多人仍然面临如何有效创建和管理…

Redis vs Memcached:Redis的三大优势

Redis vs Memcached&#xff1a;Redis的三大优势 1. 数据类型2. 数据持久化能力3. 高性能与灵活性 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1. 数据类型 Redis&#xff1a;支持多样化的数据类型&#xff0c;包括字符串&#xff08;S…

前端性能优化-回流与重绘

前言 本文总结回流与重绘相关的知识点 回流与重绘的基本概念 重绘&#xff08;Repaint&#xff09;&#xff1a; 当元素样式发生改变&#xff0c;但不影响其几何属性的时候&#xff0c;浏览器只需要重新绘制这个元素&#xff0c;这个过程被称为重绘。 回流&#xff08;Refl…

Linux_监测CPU和内存

通过TOP持续获取进程的CPU和内存消耗&#xff0c;并写入到表格 # 配置进程名 processvm-agent # 配置次数 number100 # 配置间隔时间 time5 # csv结果文件 filecm_$(date %s).csv echo "%CPU,%MEM">${file} pid$(ps -aux | grep ${process} | awk -F {OFS"…

debug\moc\mocinclude.tmp dose not exist

先把jom禁用&#xff0c;然后清理工程&#xff0c;重新编译&#xff0c;编译通过后再重新打开jom

MybatisPlus的主键策略

ASSIGN_ID(默认策略) 生成唯一的值&#xff0c;包含数字&#xff0c;表对应字段类型bigint或者varchar类型 ASSIGN_UUID() 生成唯一的值&#xff0c;包含数字和字母&#xff0c;表对应字段类型varchar类型 AUTO 主键自动增长效果&#xff0c;和表字段auto_increment INPUT …

养猫劝退?猫咪浮毛太多难清理?宠物空气净化器一招搞定

受不了了&#xff0c;真的很想把家里的猫孩子丢出去&#xff01;平日实在是太能掉毛了&#xff0c;赶上换毛季更夸张&#xff0c;家里都要被猫毛淹没了。这些还能靠多加打扫卫生清理掉&#xff0c;可空气中的浮毛真是束手无策。对于我这种过敏性鼻炎患者&#xff0c;一旦空气中…

FSRCNN论文读后感

本文的主要目的是在尽可能保持恢复质量不变的情况下&#xff0c;提高模型的处理速度&#xff0c;以将其投入实际应用。&#xff08;注意&#xff1a;本文只要是针对大尺寸图像&#xff0c;但实验结果证明&#xff0c;FRSNN模型对于小尺寸图像的处理速度也比SRCNN快&#xff0c;…

鸿蒙应用开发之GridRow和GridCol容器

在不同屏幕上布局是一个比较困难的问题,因为屏幕大小不一样,导致内容布局会比较混乱。所以提出一种网络的方式来布局,即使屏幕大小改变了,但是布局行列数不变,那么内容就不会混乱。使用组件GridRow来管理行,使用组件GridCol管理列。 先来看一下组件GridRow的定义: Grid…

VSCode在windows系统下使用conda虚拟环境配置

如何解决CondaError: Run ‘conda init‘ before ‘conda activate‘_condaerror: run conda init before conda activat-CSDN博客 首先检查自己的anaconda是否是添加到整个的环境变量里了 打开cmd如果conda和python都能够识别那么就是配置成功了 然后看插件是否安装&#xf…