繁体   English   中英

如何确定C ++中的文件中的字符串是float还是double?

[英]How to determine if string from file is float or double in C++?

我想解析一个文件,并确定我读过的数字是float还是double 我解析的文件是Matrix Market格式的矩阵之一(如下所示: https//sparse.tamu.edu/HB/1138_bus )。

基本上输入按以下顺序排列: int int float (or double)

1138 1138 2596
1 1 1474.779
5 1 -9.017133
563 1 -5.730659
2 2 9.136654
10 2 -3.405995

等等...

当我读取浮点数时,我想确定数字是否可以存储在float或者它需要一些大的数据,比如double

是否有一些最好的阅读方式,同时确定字符串是否可以存储在floatdouble

读取十进制值的问题在于,通过查看float是否具有足够的精度来判断它们并不容易。

例如,1.0009765625将完全修复float但1.1不完全适合double float (或任何二进制浮点类型)。

在浮点类型中读取时,最好总是使用double 除非您有非常具体的理由,否则通常应该避免float

您可以检查您解析的数字中的基数为10的数字。 如果它超过std::numeric_limits<float>::digits10则使用double是更好的选择。

具有这么多有效十进制数字的任何数字都可以转换为类型T的值并返回到十进制形式,不会因为舍入或溢出而发生变化

这意味着您将获得最后一个有效数字的确切数字。 由于四舍五入和溢出,其余部分不可靠。

经验法则:

  • IEEE-754单精度(浮点)可以存储大约7位小数
  • IEEE-754双精度(双精度)可存储约16位十进制数

在您的示例中, float 足以存储数字

如果您将浮点数的前7个十进制数字保存到文件中,则保证它们与原始数字完全相同。 但是,如果您对该数字进行任何操作,结果将受到舍入误差的影响,这是整个数值分析领域的主题。

你正在做什么绝对可能,但你为什么需要?

一个千兆字节可以存储2.5亿个花车。 一千兆字节可存储1.25亿双打。 如果您需要达到这么高的目标,那么在您需要更多空间之前,您将遇到性能问题。

你为什么需要精度? 如果您正在进行计算器项目或精确度非常重要的事情,那么您应该使用这样的自定义数据类型来处理数字交互:

https://gmplib.org/

这里的优点是它可以动态调整大小,并且不会对数字进行舍入,而双数和浮点数最终都必须这样做。

但是,如果您的方法已经设置完毕,我建议您阅读字符串并检查字符串的大小。 如果它是7或更长时间将它存储为double,如果它低于7位,则将其存储为浮点数。 任何超过15位的内容都将被截断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM