浮点数的倍增和除法

6
我有一个函数,我相信它可以将整数转换为浮点值,并将其拆分为值的符号、指数和小数部分。使用IEEE 754来表示浮点值。

enter image description here

unsigned test(unsigned x) {    
    // split the given bits of sign exponent and fraction, combine to return

    unsigned int sign = (x & 0x80000000) >> 31;
    unsigned int expo = (x & 0x7F800000) >> 23;
    unsigned int frac = (x & 0x007fffff);

    return (sign << 31) | (expo << 23) | frac;
}

然而,我不确定如何从这个浮点表示中计算出折半或加倍的值。

unsigned doubled(unsigned x) {
    // get float
    // float = unsigned int to float
    // doubleFloat  = 2*f
    // if float is not a number
        // return unsigned float
    // else return unsigned integer of half float

    unsigned int sign = (x & 0x80000000) >> 31;
    unsigned int expo = (x & 0x7F800000) >> 23;
    unsigned int frac = (x & 0x007fffff);

    if (expo == 0xff)
        return uf;
    else ...
}

1
只需更改指数。浮点数 = 分数 * 2^指数 * (符号 ? -1 : 1)。请注意,这里的指数是有符号值。 - Vyacheslav Napadovsky
1个回答

6

看起来你正在使用 IEEE 754 表示浮点数。

如果你想将二进制表示加倍,只需将指数增加1。同样的,如果你想减半,就将指数减少1。

请记住,这仅适用于处于正常范围内的数字,包括在加倍或减半后。


通过对指数进行1<<或>>的位移操作,可以简单地进行位移运算吗? - Silverfin
如果数字在正常范围内,只需递增/递减(exp += 1或exp -= 1)。 - Amadeus
如果将它们去规范化,事情会发生什么变化? - Silverfin
如果它们处于次正常范围,您需要进行移位操作(number <<= 1 表示乘以2,number >>= 1 表示除以2)。之后,请再次验证数字是否仍处于次正常范围。 - Amadeus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接