我正在编写一个将浮点数除以 2 的算法。对于已经标准化的数字(指数位 > 0),我认为该过程非常简单。我认为简单地将指数字段减少一个然后将该值重新插入是一种正确的方法。
我无法想出如何处理已经被非规范化的浮点数(指数位都是 0)。我了解非规范化数字是什么,并且相信我通常了解将它们分开意味着什么。我正在运行我通过另一个程序编写的算法,这是我得到的一条让我感到困惑的消息:
将值 0x7fffff 传递给函数返回 3fffff。该函数应该返回 0x400000。
我真的不明白这里发生了什么,以及为什么应该返回这个指定的值。有没有人可以尝试解释这一点以及为什么它应该返回这个值?
我处理非规范化数字的初始方法是将分数位右移一位(除以 2),这似乎不是所需的过程。
这是我所拥有的:
unsigned float_half(unsigned uf) {
unsigned exp = uf & (0x7F800000);
unsigned sign = uf & (0x80000000);
unsigned fract = uf & (0x007FFFFF);
// Check for NaN or infinity
if(exp == 0x7F800000) {
return uf;
}
// Check for denormalized numbers
if(exp == 0x00000000) {
// Need to do something here, not really sure...
return sign | exp | fract;
}
// Check for exponent of 1 (going to a denormalized number changes things)
if(exp == 0x00800000) {
fract = (0x00FFFFFF & uf) >> 1;
return fract | sign;
}
exp--;
exp = exp & (0x7F800000);
return sign | exp | fract;
}