C++ 字符串精确浮动
Posted
技术标签:
【中文标题】C++ 字符串精确浮动【英文标题】:C++ String to float with precision 【发布时间】:2013-07-04 12:28:43 【问题描述】:我有一个包含数字读数的文件(例如 5.513208E-05 / 1.146383E-05) 我读取文件并将条目存储在临时字符串中。 之后,我将临时字符串转换为浮点变量(我将其存储在多维数组中)。 我使用下面的代码进行转换。
getline(infile, temporary_string, ',');
Array[i][0] = ::atof(temporary_string.c_str());
getline(infile, temporary_string);
Array[i][1] = ::atof(temporary_string.c_str());
问题是当我将浮动打印到屏幕上时
5.51321e-05 1.14638e-05 代替 5.513208E-05 1.146383E-05
我怎样才能得到存储的精确数字???
【问题讨论】:
Array
的变量类型是什么?如果它是浮动的,请尝试将其更改为双精度。
嗯,float
会给你大约 log10(2^23) 位,即“6.92”,所以介于 6 到 7 位之间。
点击此链接可能会对您有所帮助***.com/questions/10605653/…
浮点数不精确。在 32 位系统上,float
的 6 个有效数字的精度是正常的。
【参考方案1】:
读取或转换字符串时不指定精度。相反,您在输出值时设置精度:
std::cout << std::setprecision(3) << 1.2345 << '\n';
以上将产生以下输出:
1.23参见例如this reference.
【讨论】:
谢谢...精度很好,是 cout 将其四舍五入【参考方案2】:确保您拥有double Array[][]
,而不是float
。文本表示(以 10 为基数)始终由二进制浮点数(以 2 为基数)近似,但幸运的是,当使用相同格式时,atof 的近似数具有相同的表示。一般来说,不会做太多计算,并且在输出时使用 setprecision 或格式降低精度。
【讨论】:
【参考方案3】:
数字的每个浮点表示都具有有限的精度。特别是,float
的二进制尾数有 24 位(1 个固定+23 变量),因此意味着大约 7 个十进制数字的精度。
如果您需要更精确的存储数字,您可能希望考虑使用double
而不是float
。在普通 PC 上,double
的二进制尾数有 53 位 (1+52),因此允许 15 位十进制数字精度。
但是请记住,输出这些数字时也会出现问题。我认为printf
() 和std::ostream
的默认精度只有6 位,float
和double
,除非您另有说明。但是,在输出过程中要求比数据类型提供的精度更高是没有意义的。因此,即使您可以说printf("%0.30g", some_float)
,数据类型实际支持的7 位之外的额外23 位可能不会真正产生有用的信息。
【讨论】:
以上是关于C++ 字符串精确浮动的主要内容,如果未能解决你的问题,请参考以下文章
python boto的Decimal上下文的猴子补丁,允许浮动的不精确和圆形表示。用于在运行时存储DynamoDB中的任何浮动