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

问题描述 投票:3回答:3

我想解析一个文件并确定我读过的数字是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

c++ parsing floating-point double
3个回答
9
投票

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

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

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


3
投票

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

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

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

经验法则:

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

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

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


0
投票

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

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

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

https://gmplib.org/

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

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

© www.soinside.com 2019 - 2024. All rights reserved.