我有一个用二进制编写的带有一些双精度数的文件(准确地说是9,对于3x3矩阵)。我试图将它们用作它们所代表的真正双重值(数字ej:5.66 / -1.882 / etc ..)。
它们一个接一个地放在文件中,没有任何空格: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;
}
答案 0 :(得分:2)
实数存储为浮点数。浮点运算不精确:数字的值存储为有效数字的固定数字,以及固定数字的指数。
当您尝试将浮点值打印为字符串时,该数字的格式为“十进制实数”格式。对于此格式,数字的值是四舍五入的(您希望表示具有某些精确,而不是无限数字)。
由于这种格式化,你所看到的“-0.1667”实际上是真正价值的圆润形式。另一种表示法-1.572218e + 26与真正的浮点表示非常相似。
我认为当你谈到“-0.1667”时,你所说的是你打印到文件的原始值。但是-1.667是输出变量值时所看到的值(例如,在控制台上),不是吗?这就是要点:-1.667是一个舍入值。真实值是“-1.572218e + 26”。
您正在以二进制模式将浮选点值存储在文件中,因此您可以在文件中打印数字的真实表示(二进制表示)。当您读取文件时,您将读取之前存储的相同值。当您将此值放在std :: cout中时,cout将打印该值,而不进行舍入(可以配置)。
如果您想要舍入格式,可以使用setprecision配置格式。