IEEE

您所在的位置:网站首页 double二进制存储 IEEE

IEEE

2024-07-03 02:12| 来源: 网络整理| 查看: 265

IEEE-754双精度浮点数

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

存储结构

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

在这里插入图片描述

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

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

11位指数不为00000000000和11111111111,即在00000000001 ~ 11111111110(1 ~ 2046)范围,这被称为规格化。指数值为00000000000(0),这被称为非规格化指数值为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位) bbb⋯b​​(53位及以后 ccc⋯​​)×2e−1023(00 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.52个1 111⋯11​​×22046−1023=53个1 111⋯11​​971个0 000⋯00​​ 转为十进制值为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.52个0 000⋯00​​×21−1023=0.1021个0 000⋯00​​1 转为十进制值为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.52个1 111⋯11​​×2−1022=0.1022个0 000⋯00​​52个1 111⋯11​​ 转为十进制值为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.第52位为1 000⋯01​​×2−1022=0.1073个0 000⋯00​​1 转为十进制值为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.52个1 111⋯11​​×252=53个1 111⋯11​​ 转为十进制值为 2 53 − 1 2^{53}-1 253−1 = 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×10−324]∪[5×10−324,1.7976931348623157×10308] 超过1.7976931348623157e+308为Infinity,小于-1.7976931348623157e+308为-Infinity,在(-5e-324,5e-324)之间的数显示为0



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3