从二进制转换为浮点

时间:2012-05-17 12:21:11

标签: c floating-point binary

我正在为计算机科学大学做一些练习,其中一个是关于将int 64位数组转换为它的双精度浮点值。

理解第一位,符号+/-,非常简单。对于指数也是如此,我们也知道偏差是1023。

我们遇到有效数字的问题。我怎么计算呢?

最后,我想获得这些位的实际数字。

3 个答案:

答案 0 :(得分:2)

您可以将这些位加载到与double相同大小的无符号整数中,取出该地址并将其转换为void*,然后将其转换为double*并取消引用。

当然,如果你真的应该解析浮点标准,这可能是“作弊”,但考虑到你到目前为止所说的参数,这就是我解决问题的方法。

答案 1 :(得分:2)

计算给定64位的有效位非常容易。

根据使用IEEE 754的wiki article,有效数由前53位(从位0到位52)组成。 现在,如果要将具有67位的数字转换为64位值,则可以通过将值的尾随第64位设置为1进行舍入,即使它是之前的...因为其他3位:< / p>

11110000 11110010 11111 在最后一个字节的舍入后变为 11110000 11110011 ;

因此不需要存储第53位,因为它总是值为1。 这就是为什么你只存储有效数字中的52位而不是53位。

现在计算它,你只需要定位有效数字的位范围[bit(1) - bit(52)] -bit(0)总是1-并使用它。

int index_signf = 1; // starting at 1, not 0
int significand_length = 52;
int byteArray[53]; // array containing the bits of the significand

double significand_endValue = 0;
for( ; index_signf <= significand_length ; index_signf ++)
{
    significand_endValue += byteArray[index_signf] * (pow(2,-(index_signf)));
}

significand_endValue += 1; 

现在你必须在计算它之前完全填写byteArray,使用这样的函数:

int* getSignificandBits(int* array64bits){

    //returned array

    int significandBitsArray[53];
    // indexes++
    int i_array64bits = 0; 
    int i_significandBitsArray=1;
    //set the first bit = 1

    significandBitsArray[0] = 1;



    // fill it  
    for(i_significandBitsArray=1, i_array64bits = (63 - 1); i_array64bits >= (64 - 52); i_array64bits--, i_significandBitsArray ++)
        significandBitsArray[i_significandBitsArray] = array64bits[i_array64bits];

    return significandBitsArray;
}

答案 2 :(得分:0)

如果您有对象的字节表示,则可以将字节复制到正确类型的变量的存储中以进行转换。

double convert_to_double(uint64_t x) {
    double result;
    mempcy(&result, &x, sizeof(x));
    return result;
}

您经常会看到像*(double *)&x这样的代码来进行转换,但实际上这在C语言中始终有效。