【发布时间】:2013-12-03 21:40:47
【问题描述】:
查看 C 中从无符号到浮点到无符号的往返转换,我有点惊讶地看到无符号到浮点值的舍入如下:
0x80000080
向下舍入为 (float)0x80000000,而不是向上舍入为 (float)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
趋近于零?
这样的舍入模式的动机是什么(我认为这是默认的舍入模式,因为我没有明确指定)?
【问题讨论】:
-
这可能是四舍五入的,它有一些不错的属性。
标签: c floating-point rounding