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

时间:2019-02-25 14:08:53

标签: c++ parsing floating-point double

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

3 个答案:

答案 0 :(得分:9)

读取十进制值的问题在于,仅通过查看它们来判断Inductive Prog (a : Type) : Type := | Ret : a -> Prog a | Op (s : Shape) : (forall b, Pos s a b -> Prog b) -> Prog a . 是否具有足够的精度并不容易。

例如,1.0009765625将完全固定在(* \f x -> f x x *) Definition omega {a} : LC a := Lam (* f *) (Lam (* x *) (let f := Ret (inr (inl tt)) in let x := Ret (inl tt) in App (App f x) x)). 中,但1.1不能完全固定在float(或任何二进制浮点类型)中。

读取浮点类型时,最好始终使用float。通常应避免使用double,除非您有非常具体的理由。

答案 1 :(得分:3)

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

  

具有这么多有效十进制数字的任何数字都可以转换   到T类型的值并返回十进制形式,由于   舍入或溢出

这意味着您将准确获得您的电话号码,直到最后一位有效数字为止。其余的由于舍入和溢出而不可靠。

经验法则:

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

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

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

答案 2 :(得分:0)

您在做什么绝对有可能,但是为什么要这么做?

千兆字节可以存储2.5亿个浮点数。千兆字节可以存储1.25亿双。如果您需要达到如此高的目标,那么在需要更多空间之前会遇到性能问题。

为什么需要精度?如果您要进行的是计算器项目或对精度至关重要的事情(最细微的数字大小),则应改用这样的自定义数据类型来处理数字交互:

https://gmplib.org/

此处的优点是它可以动态调整大小,并且不会舍入数字,而double和float最终都必须这样做。

但是,如果您的方法设置不正确,我建议您读入字符串并检查字符串的大小。如果大于或等于7,则将其存储为双精度数;如果小于或等于7,则将其存储为浮点数。超过15位的数字将被截断。