我正在为计算机科学大学做一些练习,其中一个是关于将int
64位数组转换为它的双精度浮点值。
理解第一位,符号+/-,非常简单。对于指数也是如此,我们也知道偏差是1023。
我们遇到有效数字的问题。我怎么计算呢?
最后,我想获得这些位的实际数字。
答案 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语言中始终有效。