2.5IEEE 754二进制浮点算术标准

计算机是不能理解十进制整数的,将十进制整数转换成计算机能够理解的二进制数是很容易的,但是如果将十进制浮点数转化成计算机能够理解的二进制形式还是相当有困难的。

1.科学记数法

IEEE 754 的开发者最终想到的方法是使用了科学记数法的思想。

科学记数法是表示数字的标准方法,您可能熟悉以 10 为基数的科学记数法。

//简写aEn
a×10n

其中一个因数为 a(1≤|a|<10),另一个因数为10n。例如:

3498523 = 3.498523×106
−0.0432 = −4.32×10−2

同样的方法也适用于以 2 为基数的科学记数法。例如:

−6.84 = −1.71×22
 
0.05 = 1.6×2−5

2.IEEE 二进制浮点算术标准

IEEE 二进制浮点算术标准 (IEEE 754) 是一种用二进制数的方式表示十进制浮点数的技术标准,由电气和电子工程师协会 (IEEE)于 1985 年制定。

(-1)sign(1 + fraction)×2exponent-bias

IEEE 754 有 3 个基本组成部分:

  1. 符号(sign)
    如果sign bit为 0,则该数字为正数;(−1)0=1.如果sign bit为 1,则该数字为负数;(−1)1=−1.
  2. 小数(fraction)
    又名尾数(mantissa).
  3. 指数(exponent)
    power(幂指数) = exponent – bias

IEEE 754 基于以上三个组成部分分为两个:单精度和双精度。

.5IEEE
TYPESSIGNEXPONENTFRACTIONBIAS
Single precision1(31st bit)8(30-23)23(22-0)127
Double precision1(63rd bit)11(62-52)52(51-0)1023

3.示例:转换到IEEE 754 格式

假设我们希望把0.085(十进制)转换成单精度格式。

3.1查看数字的符号

因为 0.085 是正数,所以sign = 0

3.2base-2 科学记数法

0.085 = (−1)0(1+fraction)×2power
或
0.085/2power = (−1)0(1+fraction)
0.085/2−1 = 0.17
0.085/2−2 = 0.34
0.085/2−3 = 0.68
0.085/2−4 = 1.36

所以,0.085 = (-1)0(1+0.36)×2−4

//0.36转换成二进制
0.010111000010100011110101110000101000111101011100001011

3.3计算指数

exponent=−4+127=123=01111011

然而,单精度格式只为我们提供 23 位来表示我们数字的小数部分。我们将不得不接受一个近似值,四舍五入到第 23 位数字。所以 IEEE 754 格式的 0.085 是:

0 01111011 01011100001010001111011

4.特殊值

类似的双精度,只是用 2049 替换 255。

VALUEEXPONENTFRACTION
Exact 000
Denormalised(非规范化)0不全部是 0
Infinity(无穷)2550
Not a Number (NaN)255不全部是 0

5.浮点数范围

非规范化规范化近似基数10
单精度± 2 -149至 (1 – 2 -23 )×2 -126± 2 -126至 (2 – 2 -23 )×2 127± 约 10 -44.85至约 10 38.53
双精度± 2 -1074至 (1 – 2 -52 )×2 -1022± 2 -1022至 (2 – 2 -52 )×2 1023± 约 10 -323.3至约 10 308.3

有五个不同的数字范围,单精度浮点数无法用迄今为止提出的方案表示:

  1. 小于 – (2 – 2 -23 ) × 2 127 的负数(负溢出)
  2. 大于 – 2 -149 的负数(负下溢)
  3. 小于 2 -149 的正数(正下溢)
  4. 大于 (2 – 2 -23 ) × 2 127 的正数(正溢出)

溢出通常意味着值变得太大而无法表示。下溢是一个不太严重的问题,因为它只是表示精度的损失,它保证接近于零。

有限IEEE浮点数的总有效范围表如下所示:

基数2基数10
单精度± (2 – 2-23) × 2127大约 ±3.402823466385288598×1038.53
双精度± (2 – 2-52) × 21023大约 ±1.797693134862315708×10308.25

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/basic/thinking-in-programming/8711.html

发表评论

登录后才能评论