我正在尝试从以下来源了解 IEEE 舍入的特性On fast IEEE Rounding
任何人都可以解释四舍五入的方程式吗?是什么意思?什么是地板和天花板功能?我试过 IEEE 754 ,但没有提到这些
我正在尝试从以下来源了解 IEEE 舍入的特性On fast IEEE Rounding
任何人都可以解释四舍五入的方程式吗?是什么意思?什么是地板和天花板功能?我试过 IEEE 754 ,但没有提到这些
让我们从 floor( ) 和 ceiling( ) 开始(从这里我将称之为“ceil”)。这些是将实数映射到整数的基本数学函数。形式上,它们定义如下:
floor(x) = max { n in Z | n <= x }
ceil(x) = min { n in Z | n >= x }
更明确地说,下限x
是不大于 的最大整数,x
上限是不小于 的最小整数x
。一些例子:
floor(1.5)
是1
。ceil(2)
是2
。floor(-3.14159)
是-4
。有关更多详细信息,请查阅维基百科。
好的,现在让我们继续四舍五入。每个实数 x 要么是一个整数(在这种情况下floor(x) == x == ceil(x)
),要么位于两个整数之间floor(x) < x < ceil(x)
。在数学上,“舍入规则”是f
将实数映射到具有以下属性的整数的函数:对于每个实x
数f(x) = floor(x)
或f(x) = ceil(x)
。这为在任何情况下选择哪种可能的结果留下了很大的灵活性,因此有很多不同的舍入规则。以下是一些示例(这些当然不是详尽无遗的):
每个floor( )
和ceil( )
都是一个舍入规则。
“向零舍入”:只需丢弃输入的小数部分。这也称为截断,通常写成称为 的数学函数trunc( )
。它可以定义为trunc(x) = ceil(x)
if x < 0
,trunc(x) = floor(x)
否则*。例如,trunc(1.5)
是1
和trunc(-2.7)
是-2
。
“从零舍入”或“向无穷大舍入”:这是截断的“相反”;如果x < 0
结果为floor(x)
,则结果为ceil(x)
否则。这条规则没有通用的数学名称,所以我就叫它round-away( )
。例子:round-away(1.001)
是2
,round-away(-0.7071067812)
是-1
。
“四舍五入”:如果输入x
是整数,则返回x
。否则,请查看floor(x)
和ceil(x)
。因为它们是连续整数,所以其中一个是偶数,另一个是奇数。返回一个奇怪的。一些例子:round-to-odd(1.001)
是1
、round-to-odd(-2.001)
是-3
和round-to-odd(4.0)
是4.0
。
“四舍五入,连到偶数”:这是 IEEE-754 的默认舍入模式。我会称它为round( )
,但这个名字(相当反常地)用于 C 库中的不同舍入规则,我不想让每个人都感到困惑,所以我将rne( )
在这里改为调用它。这里的想法如下:如果有一个唯一的整数最接近x
,则返回该整数。否则,x
正好位于两个整数的中间;其中一个是偶数,另一个是奇数。返回偶数。
最后一条规则可以写成“RU with fix-up”,尽管从数学上来说这是一种有点奇怪的思考方式。更常见的是,它或多或少地正式定义如下:
rne(x) = floor(x) if x - floor(x) < 0.5
floor(x) if x - floor(x) = 0.5 and floor(x) is even.
ceil(x) if x - floor(x) = 0.5 and floor(x) is odd.
ceil(x) if x - floor(x) > 0.5
rne( )
此规则的一些实际应用示例: rne(0.5)
is 0
. rne(-1.5)
是-2
。 rne(1.3)
是1
。 rne(1.8)
是2
。
好的,所以这都是关于四舍五入到整数值。这与 IEEE-754 中的四舍五入到最接近的浮点数有什么关系?舍入规则不仅可以用于舍入到整数,还可以用于舍入到任何固定位数,只需将其缩放一个因子b**n
,其中b
是表示的基数,并且n
被选择为使得所需的舍入点的数字以单位位置(LSB)结束。当然,我们实际上并不需要缩放数字和取消缩放结果;相反,我们只需将舍入规则中的ceil(x)
and替换为向下舍入到所需位数的值。floor(x)
x
[*] 我在这里定义实数的数学函数,而不是给出 IEEE-754 实现。因此,无需处理诸如 、 或 之类的-0
边缘inf
情况nan
。