-1

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

但是,当参数为 NaN 时,我只需要返回参数即可。理想情况下,我希望能够在没有任何铸造或高级操作的情况下实现这一点。显然,我应该能够只用按位运算和整数/无符号运算(if、while、||、&&)来做到这一点。

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

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

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

4

3 回答 3

0

您所要做的就是翻转符号位。IE

x ^ 0x80000000

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

求反不被认为是要求您返回与输入值相同的 NaN 的浮点运算,因此这通常由编译器生成用于浮点求反。

于 2012-10-18T22:54:24.117 回答
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
于 2012-10-18T22:34:09.977 回答
0

我实际上能够找到正确的解决方案。所有这些想法都有帮助。然而,我们必须运行一个检查器来验证我们的代码,唯一的错误是当我有一个零作为有符号位而 NaN 是其他的时候。因此我检查 (frac) != 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
}
于 2012-10-20T00:53:20.123 回答