我想解析一个文件,并确定我读取的数字是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
中?
答案 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类型的值并返回十进制形式,由于 舍入或溢出
这意味着您将准确获得您的电话号码,直到最后一位有效数字为止。其余的由于舍入和溢出而不可靠。
经验法则:
在您的示例中,float
足以存储该数字:
如果将浮点数的前七个十进制数字保存到文件中,则可以保证它们与原始数字完全相同。但是,如果您要对该数字进行任何操作,结果都会受到舍入误差的影响,舍入误差是整个数值分析领域的主题。
答案 2 :(得分:0)
您在做什么绝对有可能,但是为什么要这么做?
千兆字节可以存储2.5亿个浮点数。千兆字节可以存储1.25亿双。如果您需要达到如此高的目标,那么在需要更多空间之前会遇到性能问题。
为什么需要精度?如果您要进行的是计算器项目或对精度至关重要的事情(最细微的数字大小),则应改用这样的自定义数据类型来处理数字交互:
此处的优点是它可以动态调整大小,并且不会舍入数字,而double和float最终都必须这样做。
但是,如果您的方法设置不正确,我建议您读入字符串并检查字符串的大小。如果大于或等于7,则将其存储为双精度数;如果小于或等于7,则将其存储为浮点数。超过15位的数字将被截断。