【问题标题】:How to use bit-level operations to convert single-precision floating-point numbers to integers如何使用位级运算将单精度浮点数转换为整数
【发布时间】: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 &gt;&gt; 31) return TMin;这行是否必要

【问题讨论】:

  • 你对CMU的定义是什么?
  • FWIW,假设sizeof(M) == 4,那么if(M &gt;&gt; 31) 只是说if(M &lt; 0) 的一种复杂方式
  • 这是一个触发该条件的值示例:'0x4f000000' -> 2147483648.0f
  • @ThomasMatthews 卡内基梅隆大学?
  • 您应该使用unsigned 作为整数数据类型。例如,如果您有 32 位整数,则对 TMin 的初始分配会溢出。我认为 C 标准不能保证这种情况下的结果。

标签: c floating-point bit twos-complement


【解决方案1】:

尽管进行了所有检查,但仍有可能使用大于可以表示为整数的值到达函数的该点。

具体来说,如果 e 正好是 31,则没有可能的可表示正值,因为 2^31 已经大于 INT_MAX。然而,只有一个负可能的负值:-2^31,恰好是INT_MIN-2147483548。因此,之前的早期出局都无法发挥作用(或者他们可以吗?见下文)。

这就是为什么该测试发生在底部,检查标志之后。

但是,由于 -2147483548 恰好也是 TMin 的值,因此将 if(e &gt; 31) return TMin; 替换为 if(e &gt;= 31) return TMin; 会导致相同的结果。

那为什么不这样做呢?好吧,这只是我的猜测,但是同时拥有一个既是错误又是有效结果的分支并不完全直观。最重要的是,如果将错误行为更改为中断或其他内容,则很容易产生连锁问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-03
    • 2013-10-30
    • 1970-01-01
    • 2013-04-16
    • 2014-01-30
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    相关资源
    最近更新 更多