舍入到浮点数的最近整数

Ver*_*ian 5 math floating-point binary integer rounding

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

Ver*_*ian 5

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

基本算法:

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

**

对于符合IEEE-754标准的结果:

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

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

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

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


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

x = 62.3

    sign exponent             mantissa
x =  0      5       (1).11110010011001100110011
Run Code Online (Sandbox Code Playgroud)

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

指数+ 1 =第6位

savedbit = 0

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

    sign exponent             mantissa
x =  0      5       (1).11110000000000000000000
Run Code Online (Sandbox Code Playgroud)

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


另一个例子:

x = 21.9

    sign exponent             mantissa
x =  0      4       (1).01011110011001100110011
Run Code Online (Sandbox Code Playgroud)

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

指数+ 1 =第5位

savedbit = 1

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

    sign exponent             mantissa
x =  0      4       (1).01010000000000000000000
Run Code Online (Sandbox Code Playgroud)

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

我们从:

    sign exponent             mantissa
x =  0      4       (1).01010000000000000000000
Run Code Online (Sandbox Code Playgroud)

在此位置添加一个:

+                          1
Run Code Online (Sandbox Code Playgroud)

我们得到22:

    sign exponent             mantissa
x =  0      4       (1).01100000000000000000000
Run Code Online (Sandbox Code Playgroud)

  • 而不是只查看第一个小数位,你会看到所有的小数位; 如果小数位小于`.100 ...`,则不执行任何操作(正如您的代码现在所做的那样).如果它们大于`.100 ...`,则向有效数字添加一个(正如您的代码现在所做的那样).如果它们等于`.100 ...`,那么只有当有效数的LSB为1时才向有效数字添加1. (2认同)