从二进制文件中保存的 4 字节双精度读取 8 字节双精度

Reading an 8-byte double from an 4-byte double saved in a binary file

本文关键字:字节 双精度 读取 二进制文件 保存      更新时间:2023-10-16

我得到了一个二进制文件,其中包含一些双精度,字符和其他。我必须读取文件并使用其中的双精度执行数值运算。

要读取文件,我执行以下操作:

std::ifstream infile("../numbers.bin", std::ios::in | std::ios::binary);
if (!infile.is_open()) {
std::cerr << "Could not open file.";
return 1;
}
while(!infile.eof()) {
long first = 0;
double second = 0;
infile.read((char *) &first, sizeof(first));
infile.read((char *) &second, sizeof(second));
double result = first * second;
std::cout << first << "*" << second << " = " << result << std::endl;
}

但是,我得到这样的东西(看起来不对):

-4397703785598681083*4.77479e-314 = -2.09981e-295

我拿出一个十六进制编辑器查看文件,看起来保存的双精度只有 4 个字节,而不是我机器上的 8 个字节(我使用的是 Linux,二进制文件是在 Windows 机器上构建的。

我的假设是我尝试将一个 4 字节的双精度值放入一个 4 字节的双精度值,它看起来像这样:642a 0940放入一个 8 字节的双精度,结果是这样的:642a 0940 0000 0000存储到内存中,从而导致错误的双精度表示。

所以,我的实际问题是:有没有办法把这个 4 字节的双精度以正确的方式放入 8 字节的双精度中?我认为应该可以以某种方式用前导0s 作为前缀。

我也知道我可以更改编译器的设置,让双精度只有 4 个字节而不是 8 个字节,或者我可以只使用浮点数而不是双精度。 这更多的是出于好奇,想要了解它是如何工作的,以及为什么在这种情况下它没有。

编辑:我尝试使用float而不是不起作用的double。结果是-4397703785598681083*2.14321 = -9.42521e+18

试试这个?

while(!infile.eof()) {
long first = 0;
float second = 0;
infile.read((char *) &first, sizeof(first));
infile.read((char *) &second, sizeof(second));
double result = first * second;
std::cout << first << "*" << second << " = " << result << std::endl;
}