双精度浮点数
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
双精度浮点数:64位
– C/C++类型:double – 可表示最大约10308 – 可表示最接近0约10-308 – 尾数53位 31 30 20 19 阶 S 1 bit 11 bits
尾数
0
20 bits 尾数(第二部分)
32 bits
29
浮点数:IEEE754
单精度和双精度浮点数比较
• 0.3
– 实际的科学计算也不需要真正的实数 – 解决办法:量化
13
量化
码点
量化
– 把需要表示的区间划分成整数个格子,要表示的 实数向最近的格子边界靠
二位二进制小数 表示精度0.25 -1.112
-2 -1.75 -1
用更多位可以 实现更高精度
+1.102
0 1 2 量化误差 +1.5
14
量化
计算机科学引论
浮点数表示与运算
为什么讲浮点数
浮点数是程序中常用的数 浮点数是计算机技术中设计非常精巧的一个例 子 浮点数的一些设计思想被应用到计算机科学的 其它领域
2
数的表示
计算机是处理“数”的
– 数必须表示成计算机认识的格式
N位整数的表示
– 无符号:原码
• 0~(2N-1)
宽度
– 与有符号整数相同:32位,64位
符号域
– 与有符号(补码)整数相同
• 一位,在最高位,0为正1为负 有符号整数的值
d31×-231+d30×230+...+d2×22+d1×21+d0×20
一位符号 31位无符号整数 尾数和阶
24
浮点数:IEEE754
尾数和阶
– 谁在高位?
• 谁的权重大谁在高位(比较大小时先比较谁)
量化
– N位二进制数:有2N个码点 – 均匀量化:任意二个相邻码点之间的距离相等
• 可以表示的范围: D=2N×L
例:如需要的精度L=10-30,N=32 则D≈4.3×10-21 可以表示-2×10-21~ 2×10-21 连一个原子的半径都不能表示
15
量化
实际使用情况例(单位:米)
– 有关原子半径的运算
– 有符号数(阶有正负)
• 补码?
– 支持用整数比较运算实现浮点比较运算
• 补码有问题!
31
浮点数:IEEE754
把有符号补码按无符号数比较,负数比正数大
– 浮点数中,尾数和阶都被当作无符号进行比较的
• 不能用补码表示阶
d31×-231+d30×230+...+d2×22+d1×21+d0×20
化为整数:0x7f800000 ½ 0x00800000 2
33
浮点数:IEEE754
浮点数的阶码
– 不能用补码表示 移码 浮点数N位阶码:VE=V+2N-1-1
1/2 0 0111 1110 000 0000 0000 0000 0000 0000 2 0 1000 0000 000 0000 0000 0000 0000 0000
35
浮点数:IEEE754
-/+的表示
– 为何需要-/+:有时候会使用这2个数 – 表示:阶=全1,尾数=0 – 影响:5.0/0->+, -5.0/0->-
• 可以给出正确的答案,而不一定产生溢出
sqrt(-5.0)?
0.0/0.0?
– 既然5.0/0可以有正确的结果,这里也应该有 – NaN:Not a Number – 阶=全1,尾数0
– 符号域:相同 – 阶码域
• 单精度:-126~+127,双精度:-1022~+1023
– 尾数域
• 单精度:23(+1)位,双精度:52(+1)位 • 前导1被省略
30
浮点数:IEEE754
尾数的表示(无符号数)
– 支持用整数比较运算实现浮点比较运算
• 尾数越大由于表示的数也越大
– 原码
阶的表示
在2100附近
– 1.00...02× 2100~1.11...12× 2100 – 范围:2100 码点:223 表示精度:277
27
浮点数:IEEE754
如果结果太大?(>2×1038)
– (上)溢出
如果结果太小?(0<v<1×10-38)
– 下溢出
如何减少溢出的概率?
28
浮点数:IEEE754
符号 尾数 浮点数 阶
yyyy2
21
浮点数
科学运算的其它要求
– 表示范围:-~+
• 但不一定表示它们之间的所有数
– 有最大/最小范围 – 有特殊值表示+和-
– 可以用有符号整数运算对浮点数进行简单处理
• 所占存储空间应与一个整数相同 • 可以当作整数比较大小、判断0/非0
– 机器0必须也是浮点0(反之则不一定)
40
舍入( round )方法
恒舍(round down,round towards -inf)
5.3
? 101 . 010…
有限十进制小数不一定能 转换成有限二进制小数!
12
二进制小数的表示
表示精度问题
– 计算机不可能表示真正的实数
• 无理数
– 21/2(1.414213562373. . .),e(2.718...),(3.141...)
• 分数
– 2/3, 5/7, ……
– 某些有限十进制数小数无法转换成有限二进制小数
浮点数:二进制科学记数法
– 规一化要求:1尾数<2
• 尾数首位恒为1,可以隐含表示
– 基恒为2:隐含表示
?? ??
+/-1.xxxxxxxxxx2×2yyyy2
符号 尾数 阶
20
浮点数
用二进制表示浮点数
– 各部分多少位? – 各部分顺序? – 各部分编码方式?
+/-1.xxxxxxxxxx2×2
8
数的表示
二进制科学记数法
– 计算机只能使用二进制 – 所以计算机用二进制科学记数法
• 浮点数
尾数
+/- 1.02 x 2-1 2 符号
阶 “小数点” 基
9
2
数的表示
二进制科学记数法
– 表示符号
• +/-:一位二进制数表示
– 表示阶
• 有符号整数
– 表示基?
• 固定为2:不需要表示
– 表示尾数
– 无理数
• 21/2(1.414213562373. . .),e(2.718...),(3.141...)
都是科学技术上常用的数
4
数的表示
科学技术上数的表示
– 科学记数法
位数:运算可用精度 尾数 +/- 6.020000 x 1023
阶
符号 小数点
基
5
数的表示
科学记数法
– 有一个定长尾数
– 严格满足越接近0越精确 – 有一些特殊值
• -0,NaN (Not a Number)
22
浮点数的国际标准:IEEE754
IEEE Standard 754 for Binary FloatingPoint 1989 年 Arithmetic.
ACM图灵奖得主
Prof. Kahan
23
浮点数:IEEE754
31位无符号整数
尾数和阶
32
浮点数:IEEE754
补码表示阶出问题的例子
– ½ =1×2-1
• 尾数1.0,表示为0(前导1省略),阶-1,表示为 11111111(8位补码-1)
– 2=1×21
• 尾数1.0,表示为0,阶1,表示为00000001
1/2 0 1111 1111 000 0000 0000 0000 0000 0000 2 0 0000 0001 000 0000 0000 0000 0000 0000
化为整数:0x3f000000 ½ 0x40000000 2
34
浮点数:IEEE754
0的表示
– 为了用整数指令处理浮点数,浮点0必须与整数0 的表示相同 – 符号=0,阶=0,尾数=0
• “机器0” • “正0”:符号=0表示“正”
– “负0”
• 符号=1,阶=0,尾数=0
– 为何有2个0:去问数学家
• 越接近0,需要表示的精度越高
解决方案
– 非均匀量化 – 越接近0,量化越密;越远离0,量化越粗
17
量化
百度文库的表示精度与运算可用精度
– 表示精度:量化误差
• 变化的(非均匀量化) • 在确定了阶的值后,由尾数位数确定
– 运算可用精度
• 固定的:由尾数位数确定
所以尾数位数被一般性地叫做“精度”
18
量化
如何实现非均匀量化
– 科学记数法
• 无论阶的值是多少,尾数的位数是固定的
– 尾数的位数确定了在相邻两个阶之间有几个码点
• 例:二位十进制科学记数法 100 101 102 1.0~9.9x102 100个
19
103
1.0~9.9x100 1.0~9.9x101 100个 100个
浮点数
尾数:23位
– 数的精度=23+1位(首位1隐含表示)
26
浮点数:IEEE754
在0附近:
– 1.00...02× 2-126~1.11...12× 2-126 – 范围:2-126 码点:223 表示精度:2-149
在1附近
– 1.00...02× 20~1.11...12× 20 – 范围:20 码点:223 表示精度:2-23
– 规一化
0 . 1 x 10-8
-1
1 0 . 0 x 10-10
+1
7
数的表示
科学记数法
– 归一化科学记数法特点
• 尾数长度决定了数的运算可用精度
– 简称精度
• 阶增减1相当于尾数小数点右移/左移一位
– 归一化算法简单
• 比较大小的算法
– 先比较符号 – 符号相同的再比较阶 – 符号和阶都相同,再比较尾数
36
浮点数:IEEE754
32位浮点数小结
阶 0 0 1-254 255 255 尾数 0 非0 任意 0 非0 值 +/-0 ??? +/-浮点数 +/- NaN
37
浮点数:IEEE754
现有格式存在的问题
– 可表示的最小正数
a = 1.0… 2 * 2-126 = 2-126
– 可表示的第二小正数
• 二进制小数:如何表示?
10
二进制小数的表示
二进制小数
– 带小数点的二进制数:101.012
二进制小数的值
1×22+ 0×21 + 1×20 -1 =5.25 -1
+ 0×2-1 + 1×22
-1
11
二进制小数的表示
十进制小数转换成二进制小数
0 1 0 0 1 1 0 0… 0.3×2=0.6 0.6×2=1.2 0.2×2=0.4 0.4×2=0.8 ……
-
0
+
39
浮点数:IEEE754
舍入
– 为何需要舍入
• • • • 实数的运算结果:无限精度 不可能被计算机表示 计算机的浮点数是运算结果的近似值 必须把运算结果映射到浮点数可以表示的某个码点上
– 此操作称为“舍入”
• 实数到整数的变换(取整运算)
– 要映射到整数可以表示的某个码点上 • 舍入
• 小数
– 有一个固定的基
• 10:尾数的进制
– 有一个阶
• 有符号整数
+
阶增减1相当于尾数小 数点右移/左移一位 同一个数有多 个表示形式
6
– 有一个符号
数的表示
科学记数法
– 规一化要求:
• 规一化的: 进制
1尾数<10
1.0 x 10-9
• 未规一化的:
0.1 x 10-8,10.0 x 10-10
• 需要精确到约10-20 • 需要表示的范围约10-5
– 有关丈量土地的运算
• 需要精确到约10-1 • 需要表示的范围约103
如何在一个格 式的数中满足 所有这些要求
– 有关地理运算
• 需要精确到约102 • 需要表示的范围约108
16
量化
实际使用情况总结
– 需要的精度越高时,需要表示的范围也越小
– 阶在高位
+/-1.xxxxxxxxxx2×2yyyy2
31 30 S
阶 尾数 0
25
浮点数:IEEE754
单精度浮点数(C/C++类型:float)
31 30 S
1 bit 阶
23 22
尾数 23 bits
0
8 bits
阶:8位,最多可表示-128~+127
– 实际:-126~+127 – 可表示最小正数(约):1.0x2-126=10-38 – 可表示最大正数(约):2.0x2+127=1038
b = 1.000……1 2 * 2-126 = 2-126 + 2-149
a - 0 = 2-126 b - a = 2-149 b 0 a +
38
浮点数:IEEE754
解决办法
– 阶=0,尾数0还未使用 – 定义此时的有效值为: +/-0.xxxxxxxx2×2-126 – 此时
• 最小正数: • 第二小正数: 0.0....012×2-126= 2-149 0.0....102×2-126= 2-148
– 有符号:补码
• (-2N-1)~( 2N-1-1)
3
数的表示
其它的数怎么办?
– 特别大的数:一个世纪的秒数
• 3,155,760,00010 (3.1557610 x 109)
– 非常小的数:原子的直径
• 0.0000000110 (1.010 x 10-8)
– 分数
• 2/3 (0.666666666. . .)
– C/C++类型:double – 可表示最大约10308 – 可表示最接近0约10-308 – 尾数53位 31 30 20 19 阶 S 1 bit 11 bits
尾数
0
20 bits 尾数(第二部分)
32 bits
29
浮点数:IEEE754
单精度和双精度浮点数比较
• 0.3
– 实际的科学计算也不需要真正的实数 – 解决办法:量化
13
量化
码点
量化
– 把需要表示的区间划分成整数个格子,要表示的 实数向最近的格子边界靠
二位二进制小数 表示精度0.25 -1.112
-2 -1.75 -1
用更多位可以 实现更高精度
+1.102
0 1 2 量化误差 +1.5
14
量化
计算机科学引论
浮点数表示与运算
为什么讲浮点数
浮点数是程序中常用的数 浮点数是计算机技术中设计非常精巧的一个例 子 浮点数的一些设计思想被应用到计算机科学的 其它领域
2
数的表示
计算机是处理“数”的
– 数必须表示成计算机认识的格式
N位整数的表示
– 无符号:原码
• 0~(2N-1)
宽度
– 与有符号整数相同:32位,64位
符号域
– 与有符号(补码)整数相同
• 一位,在最高位,0为正1为负 有符号整数的值
d31×-231+d30×230+...+d2×22+d1×21+d0×20
一位符号 31位无符号整数 尾数和阶
24
浮点数:IEEE754
尾数和阶
– 谁在高位?
• 谁的权重大谁在高位(比较大小时先比较谁)
量化
– N位二进制数:有2N个码点 – 均匀量化:任意二个相邻码点之间的距离相等
• 可以表示的范围: D=2N×L
例:如需要的精度L=10-30,N=32 则D≈4.3×10-21 可以表示-2×10-21~ 2×10-21 连一个原子的半径都不能表示
15
量化
实际使用情况例(单位:米)
– 有关原子半径的运算
– 有符号数(阶有正负)
• 补码?
– 支持用整数比较运算实现浮点比较运算
• 补码有问题!
31
浮点数:IEEE754
把有符号补码按无符号数比较,负数比正数大
– 浮点数中,尾数和阶都被当作无符号进行比较的
• 不能用补码表示阶
d31×-231+d30×230+...+d2×22+d1×21+d0×20
化为整数:0x7f800000 ½ 0x00800000 2
33
浮点数:IEEE754
浮点数的阶码
– 不能用补码表示 移码 浮点数N位阶码:VE=V+2N-1-1
1/2 0 0111 1110 000 0000 0000 0000 0000 0000 2 0 1000 0000 000 0000 0000 0000 0000 0000
35
浮点数:IEEE754
-/+的表示
– 为何需要-/+:有时候会使用这2个数 – 表示:阶=全1,尾数=0 – 影响:5.0/0->+, -5.0/0->-
• 可以给出正确的答案,而不一定产生溢出
sqrt(-5.0)?
0.0/0.0?
– 既然5.0/0可以有正确的结果,这里也应该有 – NaN:Not a Number – 阶=全1,尾数0
– 符号域:相同 – 阶码域
• 单精度:-126~+127,双精度:-1022~+1023
– 尾数域
• 单精度:23(+1)位,双精度:52(+1)位 • 前导1被省略
30
浮点数:IEEE754
尾数的表示(无符号数)
– 支持用整数比较运算实现浮点比较运算
• 尾数越大由于表示的数也越大
– 原码
阶的表示
在2100附近
– 1.00...02× 2100~1.11...12× 2100 – 范围:2100 码点:223 表示精度:277
27
浮点数:IEEE754
如果结果太大?(>2×1038)
– (上)溢出
如果结果太小?(0<v<1×10-38)
– 下溢出
如何减少溢出的概率?
28
浮点数:IEEE754
符号 尾数 浮点数 阶
yyyy2
21
浮点数
科学运算的其它要求
– 表示范围:-~+
• 但不一定表示它们之间的所有数
– 有最大/最小范围 – 有特殊值表示+和-
– 可以用有符号整数运算对浮点数进行简单处理
• 所占存储空间应与一个整数相同 • 可以当作整数比较大小、判断0/非0
– 机器0必须也是浮点0(反之则不一定)
40
舍入( round )方法
恒舍(round down,round towards -inf)
5.3
? 101 . 010…
有限十进制小数不一定能 转换成有限二进制小数!
12
二进制小数的表示
表示精度问题
– 计算机不可能表示真正的实数
• 无理数
– 21/2(1.414213562373. . .),e(2.718...),(3.141...)
• 分数
– 2/3, 5/7, ……
– 某些有限十进制数小数无法转换成有限二进制小数
浮点数:二进制科学记数法
– 规一化要求:1尾数<2
• 尾数首位恒为1,可以隐含表示
– 基恒为2:隐含表示
?? ??
+/-1.xxxxxxxxxx2×2yyyy2
符号 尾数 阶
20
浮点数
用二进制表示浮点数
– 各部分多少位? – 各部分顺序? – 各部分编码方式?
+/-1.xxxxxxxxxx2×2
8
数的表示
二进制科学记数法
– 计算机只能使用二进制 – 所以计算机用二进制科学记数法
• 浮点数
尾数
+/- 1.02 x 2-1 2 符号
阶 “小数点” 基
9
2
数的表示
二进制科学记数法
– 表示符号
• +/-:一位二进制数表示
– 表示阶
• 有符号整数
– 表示基?
• 固定为2:不需要表示
– 表示尾数
– 无理数
• 21/2(1.414213562373. . .),e(2.718...),(3.141...)
都是科学技术上常用的数
4
数的表示
科学技术上数的表示
– 科学记数法
位数:运算可用精度 尾数 +/- 6.020000 x 1023
阶
符号 小数点
基
5
数的表示
科学记数法
– 有一个定长尾数
– 严格满足越接近0越精确 – 有一些特殊值
• -0,NaN (Not a Number)
22
浮点数的国际标准:IEEE754
IEEE Standard 754 for Binary FloatingPoint 1989 年 Arithmetic.
ACM图灵奖得主
Prof. Kahan
23
浮点数:IEEE754
31位无符号整数
尾数和阶
32
浮点数:IEEE754
补码表示阶出问题的例子
– ½ =1×2-1
• 尾数1.0,表示为0(前导1省略),阶-1,表示为 11111111(8位补码-1)
– 2=1×21
• 尾数1.0,表示为0,阶1,表示为00000001
1/2 0 1111 1111 000 0000 0000 0000 0000 0000 2 0 0000 0001 000 0000 0000 0000 0000 0000
化为整数:0x3f000000 ½ 0x40000000 2
34
浮点数:IEEE754
0的表示
– 为了用整数指令处理浮点数,浮点0必须与整数0 的表示相同 – 符号=0,阶=0,尾数=0
• “机器0” • “正0”:符号=0表示“正”
– “负0”
• 符号=1,阶=0,尾数=0
– 为何有2个0:去问数学家
• 越接近0,需要表示的精度越高
解决方案
– 非均匀量化 – 越接近0,量化越密;越远离0,量化越粗
17
量化
百度文库的表示精度与运算可用精度
– 表示精度:量化误差
• 变化的(非均匀量化) • 在确定了阶的值后,由尾数位数确定
– 运算可用精度
• 固定的:由尾数位数确定
所以尾数位数被一般性地叫做“精度”
18
量化
如何实现非均匀量化
– 科学记数法
• 无论阶的值是多少,尾数的位数是固定的
– 尾数的位数确定了在相邻两个阶之间有几个码点
• 例:二位十进制科学记数法 100 101 102 1.0~9.9x102 100个
19
103
1.0~9.9x100 1.0~9.9x101 100个 100个
浮点数
尾数:23位
– 数的精度=23+1位(首位1隐含表示)
26
浮点数:IEEE754
在0附近:
– 1.00...02× 2-126~1.11...12× 2-126 – 范围:2-126 码点:223 表示精度:2-149
在1附近
– 1.00...02× 20~1.11...12× 20 – 范围:20 码点:223 表示精度:2-23
– 规一化
0 . 1 x 10-8
-1
1 0 . 0 x 10-10
+1
7
数的表示
科学记数法
– 归一化科学记数法特点
• 尾数长度决定了数的运算可用精度
– 简称精度
• 阶增减1相当于尾数小数点右移/左移一位
– 归一化算法简单
• 比较大小的算法
– 先比较符号 – 符号相同的再比较阶 – 符号和阶都相同,再比较尾数
36
浮点数:IEEE754
32位浮点数小结
阶 0 0 1-254 255 255 尾数 0 非0 任意 0 非0 值 +/-0 ??? +/-浮点数 +/- NaN
37
浮点数:IEEE754
现有格式存在的问题
– 可表示的最小正数
a = 1.0… 2 * 2-126 = 2-126
– 可表示的第二小正数
• 二进制小数:如何表示?
10
二进制小数的表示
二进制小数
– 带小数点的二进制数:101.012
二进制小数的值
1×22+ 0×21 + 1×20 -1 =5.25 -1
+ 0×2-1 + 1×22
-1
11
二进制小数的表示
十进制小数转换成二进制小数
0 1 0 0 1 1 0 0… 0.3×2=0.6 0.6×2=1.2 0.2×2=0.4 0.4×2=0.8 ……
-
0
+
39
浮点数:IEEE754
舍入
– 为何需要舍入
• • • • 实数的运算结果:无限精度 不可能被计算机表示 计算机的浮点数是运算结果的近似值 必须把运算结果映射到浮点数可以表示的某个码点上
– 此操作称为“舍入”
• 实数到整数的变换(取整运算)
– 要映射到整数可以表示的某个码点上 • 舍入
• 小数
– 有一个固定的基
• 10:尾数的进制
– 有一个阶
• 有符号整数
+
阶增减1相当于尾数小 数点右移/左移一位 同一个数有多 个表示形式
6
– 有一个符号
数的表示
科学记数法
– 规一化要求:
• 规一化的: 进制
1尾数<10
1.0 x 10-9
• 未规一化的:
0.1 x 10-8,10.0 x 10-10
• 需要精确到约10-20 • 需要表示的范围约10-5
– 有关丈量土地的运算
• 需要精确到约10-1 • 需要表示的范围约103
如何在一个格 式的数中满足 所有这些要求
– 有关地理运算
• 需要精确到约102 • 需要表示的范围约108
16
量化
实际使用情况总结
– 需要的精度越高时,需要表示的范围也越小
– 阶在高位
+/-1.xxxxxxxxxx2×2yyyy2
31 30 S
阶 尾数 0
25
浮点数:IEEE754
单精度浮点数(C/C++类型:float)
31 30 S
1 bit 阶
23 22
尾数 23 bits
0
8 bits
阶:8位,最多可表示-128~+127
– 实际:-126~+127 – 可表示最小正数(约):1.0x2-126=10-38 – 可表示最大正数(约):2.0x2+127=1038
b = 1.000……1 2 * 2-126 = 2-126 + 2-149
a - 0 = 2-126 b - a = 2-149 b 0 a +
38
浮点数:IEEE754
解决办法
– 阶=0,尾数0还未使用 – 定义此时的有效值为: +/-0.xxxxxxxx2×2-126 – 此时
• 最小正数: • 第二小正数: 0.0....012×2-126= 2-149 0.0....102×2-126= 2-148
– 有符号:补码
• (-2N-1)~( 2N-1-1)
3
数的表示
其它的数怎么办?
– 特别大的数:一个世纪的秒数
• 3,155,760,00010 (3.1557610 x 109)
– 非常小的数:原子的直径
• 0.0000000110 (1.010 x 10-8)
– 分数
• 2/3 (0.666666666. . .)