我想解析一个文件并确定我读过的数字是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
。
有没有一些最好的阅读方式,同时确定字符串是否可以存储在float
或double
?
读取十进制值的问题在于,通过查看float
是否具有足够的精度来判断它们并不容易。
例如,1.0009765625将完全修复float
,但1.1将不完全适合double
(或任何二进制浮点类型)。
在读取浮点类型时,最好总是使用double
。除非您有非常具体的理由,否则一般应避免使用float
。
您可以检查您解析的数字中的基数为10的数字。如果它超过std::numeric_limits<float>::digits10
那么使用double
是一个更好的选择。
具有这么多有效十进制数字的任何数字都可以转换为类型T的值并返回到十进制形式,不会因为舍入或溢出而发生变化
这意味着您将获得最后一个有效数字的确切数字。由于四舍五入和溢出,其余部分不可靠。
经验法则:
在您的示例中,float
足以存储数字:
如果您将浮点数的前7个十进制数字保存到文件中,则保证它们与原始数字完全相同。但是,如果您对该数字进行任何操作,结果将受到舍入误差的影响,这是整个数值分析领域的主题。
你正在做什么绝对可能,但你为什么需要?
一个千兆字节可以存储2.5亿个花车。一千兆字节可存储1.25亿双打。如果您需要达到这么高的目标,那么在您需要更多空间之前,您将遇到性能问题。
你为什么需要精度?如果您正在进行计算器项目或精确度非常重要的事情,那么您应该使用这样的自定义数据类型来处理数字交互:
这里的优点是它可以动态调整大小,并且不会对数字进行舍入,而双数和浮点数最终都必须这样做。
但是,如果您的方法已经设置完毕,我建议您阅读字符串并检查字符串的大小。如果它是7或更长时间将它存储为double,如果它低于7位,则将其存储为浮点数。任何超过15位的内容都将被截断。