舍入到浮点数的最近整数

时间:2012-02-17 01:21:05

标签: math binary integer floating-point rounding

如何将浮点数舍入到最接近的整数?我正在寻找二进制算法,因为我必须在汇编中实现代码。

3 个答案:

答案 0 :(得分:5)

使用适当舍入到均匀的方法更新。

  

基本算法:

存储23指数+ 1位(小数点后)。接下来,将(23指数)最低有效位置零。然后使用存储的位和新的LSB进行舍入。如果存储的位位为1,则将1添加到非截断部分的LSB,并在必要时进行标准化。如果存储的位为0,则不执行任何操作。

**

  

符合IEEE-754标准的结果:

** 在将(23指数)最低有效位清零之前,将(22指数)最低有效位与OR一起清零。调用该结果或者舍入位。 存储的(23指数+ 1)位(小数点后)将被称为保护位。 然后将(23指数)最低有效位清零。

如果保护位为零,则不执行任何操作。

如果保护位为1且粘滞位为0,则如果LSB为1,则向LSB添加1。

如果保护位为1且粘滞位为1,则向LSB添加一个。


以下是使用基本算法的一些示例:

x = 62.3

    sign exponent             mantissa
x =  0      5       (1).11110010011001100110011

步骤1:存储指数+第1位(小数点后)

指数+ 1 =第6位

savedbit = 0

步骤2:将23个指数最低有效位清零 23指数= 18,所以我们将18个LSB归零

    sign exponent             mantissa
x =  0      5       (1).11110000000000000000000

第3步:使用下一位进行舍入 由于存储的位为0,我们什么都不做,浮点数已经舍入为62。


另一个例子:

x = 21.9

    sign exponent             mantissa
x =  0      4       (1).01011110011001100110011

步骤1:存储指数+第1位(小数点后)

指数+ 1 =第5位

savedbit = 1

步骤2:将23个指数最低有效位清零 23指数= 19,所以我们将19个LSB归零

    sign exponent             mantissa
x =  0      4       (1).01010000000000000000000

第3步:使用下一位进行舍入 由于存储的位是1,我们将一个加到截断部分的LSB并得到22,这是正确的数字:

我们从:

开始
    sign exponent             mantissa
x =  0      4       (1).01010000000000000000000

在此位置添加一个:

+                          1

我们得到22:

    sign exponent             mantissa
x =  0      4       (1).01100000000000000000000

答案 1 :(得分:0)

有一轮到最近的SSE指令:http://www.musicdsp.org/showone.php?id=246

inline int float2int(float x) {
    int i;
    __asm {
        fld x
        fistp i
    }
    return i;
}

答案 2 :(得分:-2)

将指数减1,加1,将指数增加1,截断。或者只需添加0.5并截断。无论哪个漂浮你的船。