我得到了一个包含一些双打,字符和其他字符的二进制文件。我必须阅读该文件并使用其中的双精度符号执行数字运算。
要读取文件,请执行以下操作:
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机器上构建的。< / p>
我的假设是我尝试将一个4字节的双字节形式的十六进制642a 0940
放在一个8字节的双字节中,结果是这样的642a 0940 0000 0000
存储到内存中从而导致错误的双重表示形式。
所以,我的实际问题是:是否有办法将这4字节的双精度数正确地转换为8字节的双精度?我认为应该以某种方式在前导0
之前加上前缀。
我也知道我可以更改编译器的设置,以使双打只有4个字节而不是8个字节,或者我可以使用浮点数代替双打。 这更多是出于想了解它是如何工作以及为什么在这种情况下不起作用的好奇心。
编辑:我尝试使用float
代替无效的double
。结果是-4397703785598681083*2.14321 = -9.42521e+18
答案 0 :(得分:0)
尝试一下?
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;
}