【发布时间】:2021-08-06 16:45:24
【问题描述】:
我在做 CMU 的数据实验室。
问题来了
/*
* floatFloat2Int - Return bit-level equivalent of expression (int) f
* for floating point argument f.
* Argument is passed as unsigned int, but
* it is to be interpreted as the bit-level representation of a
* single-precision floating point value.
* Anything out of range (including NaN and infinity) should return
* 0x80000000u.
* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
* Max ops: 30
* Rating: 4
*/
在做这个实验时,我一直想知道当 frac 位可能因移位而溢出时,是否计算符号位的位。比如e = exp - bias = 31时是否发生溢出。结果整数的符号位可以提前知道吗?还是只能知道转换结束后整数的符号位是否与原来的浮点数相同?
我已尝试完成此实验
int floatFloat2Int(unsigned uf) {
int TMin = 0x1 << 31;
int sign = uf >> 31;
int frac = uf & 0x007fffff;
int e = ((uf >> 23) & 0xff) - 127;
int M = frac | (0x1 << 23);
if(e < 0) return 0;
if(e > 31) return TMin;
if(e > 23) M = M << (e - 23);
else M = M >> (23-e);
if(!((M >> 31) ^ sign)) return M;
else if(M >> 31) return TMin;
else return ~M + 1;
}
我一直在想else if(M >> 31) return TMin;这行是否必要
【问题讨论】:
-
你对CMU的定义是什么?
-
FWIW,假设
sizeof(M) == 4,那么if(M >> 31)只是说if(M < 0)的一种复杂方式 -
这是一个触发该条件的值示例:'0x4f000000' ->
2147483648.0f -
@ThomasMatthews 卡内基梅隆大学?
-
您应该使用
unsigned作为整数数据类型。例如,如果您有 32 位整数,则对TMin的初始分配会溢出。我认为 C 标准不能保证这种情况下的结果。
标签: c floating-point bit twos-complement