定点数和浮点数_Introduction to CSAPP(七)浮点数表示的直观例子

Yannick:Introduction to CSAPP(六)浮点数表示​zhuanlan.zhihu.com
53e8891a5745081d5e11bda525e806c8.png

我们在上一篇中说明了浮点数表示的定义规范,这样看上去可能不够直观,这篇配合图片和例子,进行说明。


6位与8位浮点数实例

e56f77f621c2fe6d72abc9214b1d77bf.png
6位浮点数示例

为了直观地展示浮点数的分布情况,我们假定用6位格式来表示浮点数,其中1位表示符号,3位表示阶码,2位表示尾数。如上图。我们可以看到如下图的浮点数在枢轴上的分布:

0a28e975e9f91f67f749bc4bcae25dfb.png

3f58dc83fe29ff9c24ad206ea8f26656.png
各种情况对应到数轴的样子
  • 从图a)中可以看出,可表示的数不是均匀分布的——越靠近原点越稠密
  • 我们可以大致数出,6位可表示的浮点数是要比整型定点数个数要少的——因为NaN的存在

我们再假定用8位格式来表示浮点数,其中1位表示符号,4位表示阶码,3位表示尾数。可以得到下表:

1153094f034718615b1ca6254ea46b10.png

我们可以看到:

  • 最大非规格化数
    之间是平滑过度的——因为偏置常数选择是7而不是8
  • 将浮点数的位表示按无符号整数解释,会发现他们是升序排列的,这是IEEE有意为之的
    • 处理负数时,他们开头为1为降序排列,但是进行比较时只需要位运算进行判断即可。

浮点数的舍入与运算

以下参考
【读薄 CSAPP】壹 数据表示​wdxtub.com
10354090e4b5f86911201a170aafffb2.png

对于浮点数的加法和乘法来说,我们可以先计算出准确值,然后转换到合适的精度。在这个过程中,既可能会溢出,也可能需要舍入来满足 frac 的精度。

任何有效数上的运算结果,通常都存放在较长的寄存器中,当结果被放回浮点格式时,必须将多出来的比特丢弃。 有多种方法可以用来运行舍入作业,实际上IEEE标准列出4种不同的方法:

  • 舍入到最接近:舍入到最接近,在一样接近的情况下偶数优先(Ties To Even,这是默认的舍入方式):会将结果舍入为最接近且可以表示的值,但是当存在两个数一样接近的时候,则取其中的偶数(在二进制中是以0结尾的)。
  • 朝+∞方向舍入:会将结果朝正无限大的方向舍入。
  • 朝-∞方向舍入:会将结果朝负无限大的方向舍入。
  • 朝0方向舍入:会将结果朝0的方向舍入。

其中舍入到最接近的算法步骤是:

  1. 首先是向最近的有效数舍入
  2. 如果它与两个相邻的有效数距离一样时(即它是中间数,halfway),那么舍入到最近的偶数有效数。

几个小栗子

对于保留到百分位的十进制数字:

  • 十进制的1.234999的最近的有效数是1.23,所以它舍入到1.23
  • 十进制的1.235001的最近的有效数是1.24,所以它舍入到1.24
  • 十进制的1.235000的最近的有效数是1.24和1.23,偶数优先所以它舍入到1.24
  • 十进制的1.245000的最近的有效数是1.24和1.25,偶数优先所以它舍入到1.24

对于保留到小数点右边2位的二进制数字:

  • 10.00011(B)的最近有效数是10.00(B),所以它舍入到10.00(B)
  • 10.00110(B)的最近有效数是10.00(B),所以它舍入到10.01(B)
  • 10.11100(B)的最近有效数是11.00(B)和10.11(B),偶数优先所以它舍入到11.00(B)
  • 10.10100(B)的最近有效数是10.10(B)和10.11(B),偶数优先所以它舍入到10.10(B)

那么我们为什么选择偶数优先(又叫作银行家舍入)呢?可以看下面这个回答

为什么是4舍5入?4舍6入5取偶又是什么样的机制?​www.zhihu.com

写到这里,关于浮点数的表示、运算的部分就已经写完了,我们也可以解释Introduction to CSAPP(六)浮点数表示 - Yannick的文章 - 知乎 中提出的问题了。

这篇文章涉及到的概念有很多,看完这两篇文章我们可以尝试思考这几个论断:

1. 由于 0 的存在, 定点数中负数比正数多一个。在很多语言(比如C、Java)中最小的负数的绝对值还是一个负数,就是它自己。
2. 浮点数比定点数少。64 位定点数可以表示 2^64 个数,而 64 位双精度浮点数只能表示 2^64-2^53 +3 个值。
3. 浮点数的分布是不均匀的,[0, 2) 区间的浮点数个数比 [2, ∞) 还要多。
有哪些事实没有一定计算机知识的人不会相信?​www.zhihu.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值