浮点数舍入规则
想必大家对小数的舍入很熟悉,毕竟四舍五入是我们在小学就听到的概念。但很遗憾,计算机并没有采用这种舍入方式,因此有时我们会对它的一些进位产生疑惑,本文就为大家解开这个疑惑。
·
前言
想信大家对四舍五入很熟悉,毕竟四舍五入是我们在小学就学了的。但很遗憾,计算机中并没有采用这种舍入方式,因此有时我们会对小数的进位产生疑惑,本文就为大家解开这个疑惑。
IEEE 规定了 4 种舍入方式,先来简单看下它们舍入结果(保留 0 位小数):
| 方式 | 1.40 | 1.60 | 1.50 | 2.50 | -1.50 |
|---|---|---|---|---|---|
| 向零舍入 | 1 | 1 | 1 | 2 | -1 |
| 向下舍入(−∞-\infty−∞) | 1 | 1 | 1 | 2 | -2 |
| 向上舍入(+∞+\infty+∞) | 2 | 2 | 2 | 3 | -1 |
| 向偶数舍入(default) | 1 | 2 | 2 | 2 | -2 |
上面的前三种舍入方式还比较好理解,最后一种似乎有点莫名奇妙。但它又是最重要的舍入方式,因为它是 IEEE 标准中默认的浮点数舍入方式,下文也将围绕这个方式展开。
10 进制小数
先来简单介绍下前三种方式:
- 向零舍入:在一个数轴上,向 0 方向移动,找到第一个符合的数
- 相当于,把正数向下舍入,把负数向上舍入
- 得到值 x0‾\overline{x_0}x0,使得 ∣x0‾∣≤∣x∣\mid\overline{x_0}\mid \leq \mid x \mid∣x0∣≤∣x∣
- 向下舍入:在一个数轴上,向 −∞-\infty−∞ 方向移动,找到第一个符合的数
- 得到值 x−x^-x−,使得 x−≤xx^- \leq xx−≤x
- 向上舍入:在一个数轴上,向 +∞+\infty+∞ 方向移动,找到第一个符合的数
- 得到值 x+x^+x+,使得 x≤x+x \leq x^+x≤x+
向偶数舍入:
- 首先要找一个中间值,保留 0 位小数,中间值为:0.500.500.50;保留一位小数,中间值为:0.0500.0500.050;以此类推
- 将保留位数以后的值与该中间值比较(比如上面的:0.40、0.60、0.50)
- 大于中间值,采取向上舍入
- 小于中间值,采取向下舍入
- 等于中间值,向数轴上最近的偶数舍入
下面来是一组向偶数舍入示例(保留 2 位小数):
| 原数 | 舍入后 | 情况 |
|---|---|---|
| 7.8949997.89\color{Red}49997.894999 | 7.897.897.89 | 小于中间值 |
| 7.8950017.89\color{Red}50017.895001 | 7.907.907.90 | 大于中间值 |
| 7.8950007.89\color{Red}50007.895000 | 7.907.907.90 | 等于中间值 |
| 7.8850007.88\color{Red}50007.885000 | 7.887.887.88 | 等于中间值 |
为什么要采用向偶数舍入?使用四舍五入不好吗?
这是基于统计学的理由:我们有一组数据,需要进行舍入后再计算平均数。假如我们我们将 0.5 直接进位,那么我们最后算出的平均值将会大于实际值。而现在一个数整体上,有 50% 机率变大,有 50% 机率变小,就不存在平均值偏大的统计误差了。
2 进制小数
向偶数舍入的方法同样可以用在 2 进制小数上。
我们将最低有效位的值 0 认为是偶数,值 1 认为是奇数。
保留 0 位小数的中间值为:0.1020.10_20.102,保留 1 位小数的中间值为:0.01020.010_20.0102,以此类推。
下面是一组 2 进制小数向偶数舍入示例(保留 2 位小数):
| 原数 | 舍入后 | 情况 |
|---|---|---|
| 10.00011210.00\color{Red}011\color{Black}_210.000112 | 10.00210.00_210.002 | 小于中间值 |
| 10.00110210.00\color{Red}110\color{Black}_210.001102 | 10.01210.01_210.012 | 大于中间值 |
| 10.11100210.11\color{Red}100\color{Black}_210.111002 | 11.00211.00_211.002 | 等于中间值 |
| 10.10100210.10\color{Red}100\color{Black}_210.101002 | 10.10210.10_210.102 | 等于中间值 |
更多推荐
所有评论(0)