我正在尝试从以下来源On fast IEEE Rounding
了解IEEE舍入的功能
任何人都可以解释一下这个等式吗?什么是修复意味着什么?什么是地板和天花板功能?我尝试过IEEE 754,但它没有提到这些
答案 0 :(得分:4)
让我们从floor()和ceiling()开始(我将从这里开始称之为“ceil”)。这些是将实数映射到整数的基本数学函数。形式上,它们的定义如下:
floor(x) = max { n in Z | n <= x }
ceil(x) = min { n in Z | n >= x }
更明显地,x
的最大值是不大于x
的最大整数,并且ceil是不小于x
的最小整数。一些例子:
floor(1.5)
是1
。ceil(2)
是2
。floor(-3.14159)
是-4
。详情请咨询wikipedia。
好的,现在让我们继续四舍五入。每个实数x 是一个整数(在这种情况下为floor(x) == x == ceil(x)
),或位于两个整数floor(x) < x < ceil(x)
之间。在数学上,“舍入规则”是一个函数f
,它将实数映射到具有以下属性的整数:对于每个实数x
,f(x) = floor(x)
或f(x) = ceil(x)
。这为在任何情况下选择可能的结果留下了很大的灵活性,因此存在许多不同的舍入规则。以下是一些示例(these certainly aren't exhaustive):
floor( )
和ceil( )
均为舍入规则。
“向零舍入”:简单地丢弃输入的小数部分。这也称为截断,通常被编写为名为trunc( )
的数学函数。如果trunc(x) = ceil(x)
,则可以定义为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
。
“round to odd”:如果输入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)
是0
。 rne(-1.5)
是-2
。 rne(1.3)
是1
。 rne(1.8)
为2
。
好的,所以这就是讨论四舍五入到整数值。与IEEE-754中的舍入到最近的浮点数有什么关系?舍入规则不仅可以用于舍入到整数,还可以用于舍入到任意固定数量的数字,只需将其缩放b**n
因子,其中b
是基数。选择表示和n
,以便数字的所需舍入点以单位位置(LSB)结束。当然,我们实际上并不需要缩放数字并取消缩放结果;相反,我们只需将舍入规则中的ceil(x)
和floor(x)
替换为x
的值向下舍入,最多可达到所需的位数。
[*]我在这里定义实数上的数学函数,而不是给出IEEE-754实现。因此,无需处理-0
,inf
或nan
等边缘情况。