C舍入无符号 - >浮点转换,其中src与其向上或向下舍入的值相等?

时间:2013-12-03 21:40:48

标签: c floating-point rounding

看看C中从无符号到浮点数到无符号的往返转换,我有点惊讶地发现无符号浮点数值为:

0x80000080

向下舍入为(浮点)0x80000000而不是向上(浮点)0x80000100。请注意,由于浮点数中有1 + 23个有效尾数位,因此我们可以精确地表示具有最低0xFF位的任何无符号值。是的,这些舍入可能性都与0x80000080相距128,因此可以认为这是选择是任意的。

但是,请考虑从0x80000000开始的256位区域中的整个值范围的舍入

#include <stdio.h>

int main()
{
   unsigned i ;

   for ( i = 0 ; i < 256 ; i++ )
   {
      unsigned v = 0x80000000 + i ;

      int roundUpDiff = 256 - i ;

      float f = (float)v ;
      unsigned r = (unsigned)f ;

      printf( "0x%08X = 0x80000000 + %d = 0x80000100 - %d -> 0x%08X\n", v, i, roundUpDiff, r ) ;
   }

   return 0 ;
}

此输出的子集是:

0x8000007C = 0x80000000 + 124 = 0x80000100 - 132 -> 0x80000000
0x8000007D = 0x80000000 + 125 = 0x80000100 - 131 -> 0x80000000
0x8000007E = 0x80000000 + 126 = 0x80000100 - 130 -> 0x80000000
0x8000007F = 0x80000000 + 127 = 0x80000100 - 129 -> 0x80000000
0x80000080 = 0x80000000 + 128 = 0x80000100 - 128 -> 0x80000000
0x80000081 = 0x80000000 + 129 = 0x80000100 - 127 -> 0x80000100
0x80000082 = 0x80000000 + 130 = 0x80000100 - 126 -> 0x80000100
0x80000083 = 0x80000000 + 131 = 0x80000100 - 125 -> 0x80000100

如果对所有值的舍入选择的方向进行计数,我们会看到0x80000000-0x80000080范围内的所有值都会向下舍入(即256个值中的129个向下舍入),并且舍入所有值值范围为0x80000081-0x800000FF(即256个值中的127个向上舍入)。

使用十进制舍入类比,如果我们四舍五入到最近的十,这似乎是一个舍入值的决定:

9,8,7,6 

向上十,但是数字四舍五入:

5,4,3,2,1,0

下降到零?

这样的舍入模式的动机是什么(我认为它是默认的舍入模式,因为我没有明确指定其他方式)?

1 个答案:

答案 0 :(得分:1)

典型的FP舍入模式(可以控制)是最接近的,与偶数相关 对于兼容的C编译器,整数舍入为0。另见@Pascal Cuoq评论。

[编辑]第一篇文章是signed。每个OP更改为unsigned

示例:uint32_tfloatuint32_t

8000007F 0x1.000000p+31 80000000  Nearer to lower value, round down   
80000080 0x1.000000p+31 80000000  Tie, round down as its "even"  
80000081 0x1.000002p+31 80000100  Nearer to higher value, round up   

8000017F 0x1.000002p+31 80000100  Nearer to lower value, round down  
80000180 0x1.000004p+31 80000200  Tie, round up as its "even"  
80000181 0x1.000004p+31 80000200  Nearer to higher value, round up  

“Even”在此上下文中表示要舍入到的2个选项,选择float的最低有效位设置为0的那个。


参考

C11dr附件F.3(规范性)IEC 60559浮点运算说

- 从整数到浮点类型的转换提供从整数到浮点的IEC 60559转换 - 从浮动到整数类型的转换提供类似IEC 60559的转换,但总是向零舍入。