所以我很难实现这个想法。我基本上只想接受'uf'这个论点并否定它。我将参数视为32位的无符号整数,这与单个精度浮点数看起来是一种等价。应该工作相同:有符号位,8位指数,23位小数。
但是,当参数是NaN时,我需要返回参数。 理想情况下,我希望能够在没有任何强制转换或高级操作的情况下实现此功能。显然我应该只使用按位运算和整数/无符号运算(if,while,||,&&)来实现。
我不知道从哪里开始?我是否只需要提取'uf'的每一部分并单独否定它们(使用按位运算符),然后将它们全部加在一起?我可能会使用(~uf)+ 1来否定。
对于NaN,我认识到我只需要检查8位部分(exp)中的所有1以及小数部分中除0之外的任何内容(否则它被视为无穷大)。
作为重复,这是在C中为32位系统完成的。
答案 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
}