IEEE-754 64位双精度浮点数存储详解

article/2025/6/10 5:03:00

IEEE-754双精度浮点数

IEEE二进制浮点数算术标准(IEEE 754)规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现),本文介绍64位双精度浮点数。

存储结构

IEEE-754双精度浮点数(double floating-point)存储为64bit,由符号位(s)、有偏指数(e)、小数部分(f)组成:

在这里插入图片描述

组成描述位数位置
sign符号,0表示正,1表示负1bit63
exponent指数部分11bit52-62
fraction小数部分52bit0-51

类型划分

11位的指数部分可存储00000000000 ~ 11111111111(十进制范围为0 ~ 2047),取值可分为3种情况:

  1. 11位指数不为00000000000和11111111111,即在00000000001 ~ 11111111110(1 ~ 2046)范围,这被称为规格化。
  2. 指数值为00000000000(0),这被称为非规格化
  3. 指数值为11111111111(2047),这是特殊值,有两种情况:
    • 当52位小数部分f全为0时,若符号位是0,则表示+Infinity(正无穷),若符号位是1,则表示-Infinity(负无穷)
    • 当52位小数部分f不全为0时,表示NaN(Not a Number)

规格化

规格化下,浮点数的形式可表示为:
( − 1 ) s × 1. b b b ⋯ b ⏟ f ( 有 效 52 位 ) ( c c c ⋯ ⏟ 53 位 及 以 后 ) × 2 e − 1023 ( 0 < e < 2047 ) (-1)^s\times1.\underbrace{bbb\cdots b}_{f(有效52位)}(\underbrace{ccc\cdots}_{53位及以后})\times2^{e-1023} \quad (0< e < 2047) (1)s×1.f(52) bbbb(53 ccc)×2e1023(0<e<2047)
其中:

  • s为0或1,0表示正数,1表示负数,对应1bit的符号位
  • f为52位有效位,其中的每一位b是0或1,对应52bit的小数部分(不足52位补0)
  • c是超出52位的部分(如果有的话,需要舍入(精度会丢失),规则下述)
  • e为十进制数值,其11位的二进制数值对应11bit的指数部分
  • 1023移码,移码值为 2 n − 1 − 1 2^{n-1}-1 2n11,这里的n表示指数位数,对于64bit的双精度存储,n是11

十进制中,12345可表示为 1.2345 × 1 0 4 1.2345\times10^4 1.2345×104;二进制中,10011可表示为 1.0011 × 2 4 1.0011\times2^4 1.0011×24

先看个简单例子,计算2.25的双精度浮点数:

2.25转为二进制为10.01,10.01转为上述表示法为 1. 001 ⏟ f × 2 1 1.\underbrace{001}_{\scriptsize{f}}\times2^1 1.f 001×21,可得:

  • 数值为正,因此符号位是0
  • 小数为001,不足52位,补0,得到
    0010000000000000000000000000000000000000000000000000 ⏟ 001 后 49 个 0 共 52 位 \underbrace{0010000000000000000000000000000000000000000000000000}_{001后49个0\quad共52位} 00149052 0010000000000000000000000000000000000000000000000000
  • 指数e-1023 = 1,则 e = 1024,二进制值为 10000000000 ⏟ 11 位 \underbrace{10000000000}_{11位} 11 10000000000

综上,将1位符号、11位指数、52位小数整合可得到2.25的双精度浮点数表示:
0 ⏟ s 10000000000 ⏟ e 0010000000000000000000000000000000000000000000000000 ⏟ f \underbrace{0}_{s}\underbrace{10000000000}_{e}\underbrace{0010000000000000000000000000000000000000000000000000}_{f} s 0e 10000000000f 0010000000000000000000000000000000000000000000000000
上述步骤反向操作可得到十进制值

上面这个例子中,小数部分不存在舍入的问题(位数小于52位),那么如果小数超出了52位,如何处理呢?有以下几种情况:

1、第53位是0,无需处理
2、第53位是1且53位之后全是0:

  • 若第52位是0,无需处理;
  • 若第52位是1,那么向上舍入

3、第53位是1,且之后不全是0:那么向上舍入

再看一个例子,计算23.3的双精度浮点数:
23.3转为二进制为
10111.0100110011001100110011001100110011001100110011001100 ⋯ ⏟ 1100 循 环 10111.0100110011001100110011001100110011001100110011001100\underbrace{\cdots}_{1100循环} 10111.01001100110011001100110011001100110011001100110011001100
改写为
1. 0111010011001100110011001100110011001100110011001100 ⏟ 52 位 1100 ⋯ ⏟ 1100 循 环 × 2 4 1.\underbrace{0111010011001100110011001100110011001100110011001100}_{52位}\underbrace{1100 \cdots}_{1100循环}\times2^4 1.52 01110100110011001100110011001100110011001100110011001100 1100×24
数值为正,因此符号位是0;指数e -1023 = 4,e = 1027 = 10000000011,因此指数部分是10000000011;小数位无限循环,53位是1且之后不全是0,符合上述规则3,因此向上舍入,第52位由0变为1,最终小数部分为:
0111010011001100110011001100110011001100110011001101 0111010011001100110011001100110011001100110011001101 0111010011001100110011001100110011001100110011001101
整合后得到23.3的双精度浮点数表示:
0 ⏟ s 10000000011 ⏟ e 0111010011001100110011001100110011001100110011001101 ⏟ f \underbrace{0}_{s}\underbrace{10000000011}_{e}\underbrace{0111010011001100110011001100110011001100110011001101}_{f} s 0e 10000000011f 0111010011001100110011001100110011001100110011001101


非规格化

非规格化可用以下形式表示(小数点前面是0):
( − 1 ) s × 0. b b b ⋯ b ⏟ f ( 52 位 ) × 2 e − 1022 ( e = 0 ) (-1)^s\times0.\underbrace{bbb\cdots b}_{f(52位)}\times2^{e-1022} \quad (e=0) (1)s×0.f(52) bbbb×2e1022(e=0)
f = 0 f=0 f=0(52位小数全为0)时,表示的值是0: s = 0 s=0 s=0表示-0, s = 1 s=1 s=1表示+0


特殊值

e = 2047 e=2047 e=2047(11位指数全为1)时:

  • f > 0 f>0 f>0,表示NaN
  • f = 0 , s = 0 f=0,s=0 f=0,s=0,表示+Infinity
  • f = 0 , s = 1 f=0,s=1 f=0,s=1,表示-Infinity

数值范围

1、在规格化中,当指数e最大(前10位为1,11位为0,即2046)且小数f最大(52位全为1)时,能表示出最大正值,为
1. 111 ⋯ 11 ⏟ 52 个 1 × 2 2046 − 1023 = 111 ⋯ 11 ⏟ 53 个 1 000 ⋯ 00 ⏟ 971 个 0 1.\underbrace{111\cdots11}_{52个1}\times2^{2046 - 1023} = \underbrace{111\cdots11}_{53个1}\underbrace{000\cdots00}_{971个0} 1.521 11111×220461023=531 111119710 00000
转为十进制值为1.7976931348623157e+308,则能表示的最小负值-1.7976931348623157e+308

2、在规格化中,当指数e最小(前10位为0,11位为1,即1)且小数f最小(52位全为0)时,能表示出最小正值,为
1. 000 ⋯ 00 ⏟ 52 个 0 × 2 1 − 1023 = 0. 000 ⋯ 00 ⏟ 1021 个 0 1 1.\underbrace{000\cdots00}_{52个0}\times2^{1 - 1023} = 0.\underbrace{000\cdots00}_{1021个0}1 1.520 00000×211023=0.10210 000001
转为十进制值为2.2250738585072014e-308,则能表示的最大负值-2.2250738585072014e-308


在非规格化中,指数e为0
1、当小数f最大(52位全为1)时,能表示出最大正值,为
0. 111 ⋯ 11 ⏟ 52 个 1 × 2 − 1022 = 0. 000 ⋯ 00 ⏟ 1022 个 0 111 ⋯ 11 ⏟ 52 个 1 0.\underbrace{111\cdots11}_{52个1}\times2^{-1022} = 0.\underbrace{000\cdots00}_{1022个0}\underbrace{111\cdots11}_{52个1} 0.521 11111×21022=0.10220 00000521 11111
转为十进制值为2.225073858507201e-308,则最小负值-2.225073858507201e-308

2、当小数f最小(前51位为0,52位为1)时,能表示出最小正值,为
0. 000 ⋯ 01 ⏟ 第 52 位 为 1 × 2 − 1022 = 0. 000 ⋯ 00 ⏟ 1073 个 0 1 0.\underbrace{000\cdots01}_{第52位为1}\times2^{-1022} = 0.\underbrace{000\cdots00}_{1073个0}1 0.521 00001×21022=0.10730 000001
转为十进制值为5e-324,则最大负值-5e-324

整数范围(精确整数,无精度丢失)

当 e - 1023 = 52,即e = 1075,小数f最大(52位全为1)时,能表示出最大安全正整数,为
1. 111 ⋯ 11 ⏟ 52 个 1 × 2 52 = 111 ⋯ 11 ⏟ 53 个 1 1.\underbrace{111\cdots11}_{52个1}\times2^{52} = \underbrace{111\cdots11}_{53个1} 1.521 11111×252=531 11111
转为十进制值为 2 53 − 1 2^{53}-1 2531 = 9007199254740991,则能表示的最小安全负整数-9007199254740991

总结

1、javascript中的数值统一采用IEEE-754双精度存储,因此在计算时可能出现精度丢失,导致奇怪的结果,如 0.1 + 0.2 !== 0.3

2、下表列出了IEEE-754中的数值边界值,其中某些值对应javascript中的数值常量

-最小负值最大负值最小正值最大正值最小安全负整数最大安全正整数
规格化-1.7976931348623157e+308-2.2250738585072014e-3082.2250738585072014e-3081.7976931348623157e+308(Number.MAX_VALUE)-9007199254740991(Number.MIN_SAFE_INTEGER)9007199254740991(Number.MAX_SAFE_INTEGER)
非规格化-2.225073858507201e-308-5e-3245e-324(Number.MIN_VALUE)2.225073858507201e-308xx

IEEE 754可以表示的数值范围是:
[ − 1.7976931348623157 × 1 0 308 , − 5 × 1 0 − 324 ] ∪ [ 5 × 1 0 − 324 , 1.7976931348623157 × 1 0 308 ] [-1.7976931348623157\times10^{308},-5\times10^{-324}] \cup [5\times10^{-324},1.7976931348623157\times10^{308}] [1.7976931348623157×10308,5×10324][5×10324,1.7976931348623157×10308]
超过1.7976931348623157e+308Infinity,小于-1.7976931348623157e+308-Infinity,在(-5e-324,5e-324)之间的数显示为0


http://chatgpt.dhexx.cn/article/dyvue3yX.shtml

相关文章

CSAPP学习记录-IEEE浮点表示

使用二进制定点表示浮点数十分麻烦&#xff0c;且由于有些浮点数的二进制不能精确表示&#xff0c;只能添加小数位数不断近似&#xff0c;使得位数开销极大。20世纪70年代已经有一些计算机厂家推出了自己的浮点数表示标准&#xff0c;但并不统一&#xff0c;于是在1985年IEEE 7…

聊一聊 IEEE754 标准(里面涉及浮点数精度丢失问题)

一、什么是 IEEE754 标准 IEEE 二进制浮点数算术标准&#xff08;IEEE 754&#xff09;是 20 世纪 80 年代以来最广泛使用的浮点数运算标准&#xff0c;为许多 CPU 与浮点运算器所采用。IEEE754 标准提供了如何在计算机内存中&#xff0c;以二进制的方式存储十进制浮点数的具体…

【算法】解析IEEE 754 标准

目录结构&#xff1a; contents structure [-] 浮点数的存储过程 次正规数&#xff08;Denormalized Number&#xff09;零&#xff08;zero&#xff09;非数值&#xff08;NaN&#xff09;无穷大&#xff08;infinity&#xff09;除数为0.0会发生什么浮点数的范围浮点数的精度…

如何深刻理解IEEE浮点数的表示(IEEE floating-point representation)

引言 大家都知道&#xff0c;可以在计算机处理器直接运行的是由0,1构成的机器代码(machine code)&#xff0c;本文将介绍浮点数(floating-point number )在机器码中是如何被编码表示的。 整数(integer)是如何被编码的呢&#xff1f;小伙伴们应该听过补码&#xff0c;原码&…

【论文学习】7、ieee802.11ah中基于深度学习的载波频偏估计

摘要 基于ieee802.11标准的Wi-Fi系统是最流行的无线接口&#xff0c;它采用先听后讲&#xff08;LBT&#xff09;的方式进行信道接入。大多数基于LBT的系统的显著特征是&#xff0c;发射机使用在数据之前的前导码来允许接收机执行分组检测和载波频率偏移&#xff08;CFO&#…

计算机中的小数 IEEE754

计算机中的小数 IEEE754 进制计数系统 在基数b的位置记数系统(其中b是一个正自然数&#xff0c;叫做基数)&#xff0c;b个基本符号(或者叫数字)对应于包括0的最小b个自然数。 要产生其他的数&#xff0c;符号在数中的位置要被用到。最后一位的符号用它本身的值&#xff0c;向…

计算机组成原理:IEEE754标准中,为什么指数真值e变成阶码加上的偏移值是127不是128?

1.浮点数在计算机里的存储方式 以32位为例,短浮点型float,按照按照 IEEE754 标准,在计算机里的存储格式如下 数符S&#xff1a;表示浮点数的符号&#xff0c;占1位&#xff0c;0—正数、1—负数&#xff1b; 尾数M&#xff1a;23位&#xff0c;原码纯小数表示&#xff0c;小数…

ieee sci 期刊 写作经验 分享 博士发展阶段

0. 前言 本文仅记录最近我在论文写作中遇到的问题&#xff08;感谢老师、师兄的用心指导&#xff09;&#xff0c;仅仅是我的个人分享&#xff0c;不适用于所有人。 1. introduction - 如何切入自己的工作&#xff1f; 1.1 不要没事找事 例子&#xff1a; 比如你做的是目标…

谈谈论文的发表(电光与控制,IEEE ACCESS)

前言 目前&#xff0c;科研任务差不多告一段落&#xff0c;总结一下发表论文的经验以及经历。 2021年3月&#xff0c;录用IEEE ACCESS一篇&#xff0c;本来老师想让投IEEE trans系列&#xff0c;但是工作的深度差一点&#xff0c;并且没有很好的实例论证&#xff0c;只有仿真&…

IEEE 754标准

普通规则下: 移码: 补码的基础上将符号位取反。注意:移码只能用于表示整数 移码的定义: 移码 真值 偏置值(确定移码&#xff0c;首先要确定偏置值) 偏置值一般取2^n-1&#xff0c;此时移码 补码符号位取反 IEEE 754规则下&#xff1a; 偏置值 2^n-1 - 1 相当于将普通规…

IEEE 754浮点数工业标准

文章目录 浮点数概述浮点数的格式IEEE 754标准规定的浮点数的格式IEEE 754偏移量与指数范围问题IEEE 754中浮点数值的三种情况&#xff1a;1. 规格化的浮点数的值2. 非规格化的值3. 特殊值 Java中的浮点数类型 浮点数概述 浮点数&#xff0c;是属于有理数中某特定子集的数的数字…

SPSS Modeler导入excel文件时出现“无法读取文件列名”解决方法

SPSS Modeler导入excel文件时出现“无法读取文件列名”解决方法 经过本人多次尝试&#xff0c;终于发现了原因 原因是&#xff1a;excel文件在后台打开了&#xff0c;因此spss modeler读取不了 解决方法&#xff1a;关闭正在打开的该excel文件&#xff0c;再读取即可 如果解决了…

SPSS Modeler 数据导入操作

1、导入文本文件 数据选项卡&#xff0c;主要是指定所读取数据的基本类型&#xff0c;通常无需修改&#xff0c;若需修改要先在覆盖那里打钩&#xff0c;然后下拉存储框进行修改 过滤选项卡是选择读取数据时读取哪些数据&#xff0c;同时可以修改变量名。 类型选项卡是指定读取…

SPSS导入excel文件时,保留4位小数点

SPSS导入excel文件时&#xff0c;保留4位小数点 SPSS导入excel文件时&#xff0c;会只保留整数部分&#xff0c;而小数点部分的数据不显示&#xff0c;如下图&#xff1a; 我尝试在SPSS的变量视图里将小数点位数改成4位&#xff0c;如图&#xff0c;但是导入数据后&#xff0c…

SPSS for Mac导入Excel表格找不到文件、以及“文件受密码保护”报错问题的解决办法

SPSS版本25&#xff0c;在导入Excel文件时显示不出来&#xff0c;需要移动到磁盘-用户-apple里面&#xff0c;我这里是我自己的用户名&#xff0c;移进去就可以看到了 之后可以用导入文件打开&#xff0c;也可以直接拖到数据视图&#xff0c;但是我这边又出现了一个小问题 出现…

SPSS数据抽取

SPSS数据抽取 数据抽取一般分为两类&#xff1a;字段拆分和随机抽样 字段拆分 数据抽取&#xff0c;也称为数据拆分&#xff0c;是只保留原数据表中的某些字段、记录的部分信息&#xff0c;形成一个新字段、新记录。 在spss中导入我们需要的数据&#xff0c;变量主要包含如…

利用SPSS做数据分析②之数据处理1

SPSS数据处理有六个步骤&#xff0c;分别是&#xff1a; 数据导入数据清洗数据抽取数据合并数据分组数据标准化 数据处理是根据数据分析的目的&#xff0c;将收集到的数据&#xff0c;用适当的处理方法进行加工、整理&#xff0c;形成适合数据分析的要求样式&#xff0c;它是数…

SPSS怎么筛选无效数据

我们在用IBM SPSS进行数据分析的时候&#xff0c;经常会遇见这样一种情形&#xff0c;想把不符合自己分析要求的数据全部筛掉。我们把这些要筛掉的数据叫作无效数据&#xff0c;无效数据不筛选掉不但会降低分析的效率&#xff0c;而且会影响最终结果的准确性。 要想提高准确性…

SPSS学习笔记

什么都写 插入个案&#xff1a;指一行 插入变量&#xff1a;指一列 设置 语言 编辑->选项 语言中可以选择输出的语言和界面的语言 变量定义 左下角切换到变量视图&#xff0c;可以修改变量的属性 1.类型可选&#xff0c;注意会影响到后面测量中的选项&#xff0c;如…

SPSS数据插补方法

问题&#xff1a;ArcGIS多值提取至点的数据有很多缺失值 这是对多个区域分区统计后的结果&#xff0c;由于ET的质量不高&#xff0c;所以有很多缺失值 那么&#xff0c;怎样才能将这些值进行插补成我们认为可靠的格式呢&#xff1f; 第一步-将arcgis多值提取至点的数据整理成…