单精度浮点否定的位级表达式

时间:2012-10-18 18:23:15

标签: floating-point bit-manipulation unsigned-integer

所以我很难实现这个想法。我基本上只想接受'uf'这个论点并否定它。我将参数视为32位的无符号整数,这与单个精度浮点数看起来是一种等价。应该工作相同:有符号位,8位指数,23位小数。

但是,当参数是NaN时,我需要返回参数。 理想情况下,我希望能够在没有任何强制转换或高级操作的情况下实现此功能。显然我应该只使用按位运算和整数/无符号运算(if,while,||,&&)来实现。

我不知道从哪里开始?我是否只需要提取'uf'的每一部分并单独否定它们(使用按位运算符),然后将它们全部加在一起?我可能会使用(~uf)+ 1来否定。

对于NaN,我认识到我只需要检查8位部分(exp)中的所有1以及小数部分中除0之外的任何内容(否则它被视为无穷大)。

作为重复,这是在C中为32位系统完成的。

3 个答案:

答案 0 :(得分:0)

x ^                        // flip signbit if not NaN
    (0x80000000 &          // isolate the signbit
      ~(                   // together, set signbit iff not NaN
         ((x & expmask) + expone) & // sets the signbit iff exp == 11111111
         -(x & mantmask))) // sets signbit only if the mantissa bits aren't zero

答案 1 :(得分:0)

你所要做的就是翻转符号位。即。

x ^ 0x80000000

如果该值为NaN,即使您翻转符号位,它仍然是NaN。

否定不被视为需要返回与输入值相同的NaN的浮点运算,因此这通常由编译器生成浮点否定。

答案 2 :(得分:0)

我实际上能够找到正确的解决方案。所有这些想法都有所帮助。但是,我们必须运行一个检查器来验证我们的代码,并且唯一错误的是当我将零作为有符号位并且NaN是其他所有内容时。因此我检查(压裂)!= 0。

unsigned float_neg(unsigned uf) 
{

unsigned exp = (uf >> 23) & 0xFF;  //get only the exponential part of the number
unsigned frac = (uf << 9);  //get only the fractional part of the number
if ((exp == 0xFF) && (frac) != 0) 
{
  return uf; //NaN so return 'uf'
}

return uf ^ (1 << 31);  //just apply a simple sign change to the 's' component
}