-1

我有一个文件,其中包含一些用二进制编写的双精度数(准确地说是 9,对于 3x3 矩阵)。我正在尝试将它们用作它们所代表的真正双精度值(数字 ej:5.66 / -1.882 / 等等)。

它们一个接一个地放在文件中,没有任何空格:3.245-2.453.253……它们正好是9个数字。

然后我有一个结构体,其指针指向一个包含 9 个插槽 (0-8) 的向量,我想用双精度值填充它,所以,这就是我目前正在尝试的内容:

struct input{
    double data*;
    double myvector[9];
};

接着

input test;
test.data = test.myvector;
ifstream f(file,ios::binary);

f.read(reinterpret_cast<char *>(test.data),sizeof(double)*3*3);

然后,当我用一些简单的 std::cout 检查值时,我在控制台中打印了一些奇怪的数字:

-0.1667 打印为:-1,57218e+26

这应该发生吗?如果没有,我做错了什么?如果我做对了,我要如何处理这个值才能得到我的“-0.1667”?

谢谢你。

编辑:当他们创建文件时,他们有一个指针(指向一个像我的例子一样的双精度向量),他们只是做了一个 f.write(不管你放什么);这就是我所说的数字是一个接一个的意思,那里的任何双精度之间都没有黑色字符。

编辑2:完整代码:

#include <iostream>
#include <fstream>

using namespace std;

struct input{
    double data*;
    double myvector[9];
};

int main(int argc, char * argv[]){

    input test;
    test.data=test.myvector;

    ifstream f(argv[1], ios::binay); // argv[1] is the file EJ: ./program myfile
    f.read(reinterpret_cast <char *> (test.data), sizeof(double)*9); // being 9 values.

    for(int i=0;i<9;i++){

        cout << test.data[i] << endl;

    }
return 0;
}
4

1 回答 1

2

实数存储为浮点数。浮点运算不精确:数字的值存储为有效数量的固定数字和固定数字的指数。

当您尝试将浮点值打印为字符串时,该数字将被格式化为“十进制实数”格式。对于这种格式,数字的值是四舍五入的(您需要具有一定精度的表示,而不是无限位数)。

由于这种格式,您所看到的“-0.1667”实际上是实际值的四舍五入形式。另一种表示法 -1.572218e+26 与真正的浮点表示非常相似。

我想当您谈论“-0.1667”时,您正在谈论您打印到文件的原始值。但是 -1.667 是您在输出变量值时看到的值(例如在控制台上),不是吗?这就是重点:-1.667 是一个四舍五入的值。真实值为“-1.572218e+26”。

您将浮点值以二进制模式存储在文件中,因此您在文件中打印数字的真实表示(二进制表示)。读取文件时,您读取的值与之前存储的值相同。当您将此值放入 std::cout 时,cout 会打印该值,而不进行四舍五入(可以配置)。

如果你想要四舍五入的格式,你可以使用setprecision来配置格式。

于 2013-05-20T19:26:59.320 回答