2

I have a file with number readings (example 5.513208E-05 / 1.146383E-05) I read the file and store the entries in a temporary string. After that I convert the temporary string into float variable (which I store in an Multi Dimensional Array). I use the code below to convert.

getline(infile, temporary_string, ',');

Array[i][0] = ::atof(temporary_string.c_str());

getline(infile, temporary_string);

Array[i][1] = ::atof(temporary_string.c_str());

The problem is that when I print the floats to the screen

5.51321e-05 1.14638e-05 instead of 5.513208E-05 1.146383E-05

How can I get the precise numbers stored ???

4

3 回答 3

4

读取或转换字符串时不指定精度。相反,您在输出值时设置精度:

std::cout << std::setprecision(3) << 1.2345 << '\n';

以上将产生以下输出:

1.23

参见例如this reference

于 2013-07-04T12:33:24.063 回答
0

确保你有double Array[][],没有float。文本表示(以 10 为基数)始终由二进制浮点数(以 2 为基数)近似,但幸运的是,当使用相同格式时,atof 的近似数具有相同的表示。一般来说,不会做太多计算,并且在输出时使用 setprecision 或格式的降低精度。

于 2013-07-04T12:36:42.590 回答
0

数字的每个浮点表示都具有有限的精度。特别是,float它的二进制尾数有 24 位(1 个固定 + 23 个变量),因此意味着大约 7 个十进制数字的精度。

如果您需要更精确的存储数字,您可能希望考虑使用double而不是float. 在普通 PC 上,double二进制尾数有 53 位 (1+52),因此允许 15 位十进制数字精度。

但请记住,输出这些数字时也会出现问题。我认为printf() 和for的默认精度std::ostream只有 6 位,除非您另有说明。但是,在输出过程中要求比数据类型提供的精度更高是没有意义的。因此,即使您可以说,数据类型实际支持的 7 位之外的额外 23 位可能不会真正产生有用的信息。 floatdoubleprintf("%0.30g", some_float)

于 2013-07-04T13:46:31.113 回答