从二进制文件中保存的 4 字节双精度读取 8 字节双精度
Reading an 8-byte double from an 4-byte double saved in a binary file
我得到了一个二进制文件,其中包含一些双精度,字符和其他。我必须读取文件并使用其中的双精度执行数值运算。
要读取文件,我执行以下操作:
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 字节的双精度中?我认为应该可以以某种方式用前导0
s 作为前缀。
我也知道我可以更改编译器的设置,让双精度只有 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;
}
相关文章:
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 检查是否以特定精度给出双精度
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C 字符串返回字符串的整数/双精度/长整型值
- 为什么当我使用双精度时,Qt<->Matlab 正确写入和读取我的字节,但存储 uint32 的字节不正确?
- 如何在 Arduino C++ 中将大小为 64 的字节数组转换为双精度值列表?
- 从二进制文件中保存的 4 字节双精度读取 8 字节双精度
- 当在网络字节顺序中放置双精度时,为什么它是在 4 字节块中完成的
- 由于 FPU 或缓存而与 8 字节边界对齐的双精度
- 在 rapidjson 解析中获取双精度值的原始字符串(或字节)
- c++双精度到字节数组
- 添加字节*数据到双精度向量
- 堆上的双精度对象总是8字节对齐
- 是否不可能在QdataStream中为浮点写4个字节,为双精度写8个字节
- 读取存储在双精度体中的8字节字段中的4个字节
- 如何处理"variant time"(DATE,双精度,8 字节)?