OCaml 中的 IEEE 64 和 32 位浮点验证



我有一个与以下正则表达式-?[0-9]*.[0-9]+匹配的字符串,据说它表示IEEE浮点数。它可以是单精度或双精度,我事先知道类型。我需要检查它是否可以在给定的优先级中解释为有效值。像这样:

val is_valid_float: string -> bool
val is_valid_double: string -> bool

对于双精度数字,我可以使用float_of_string解析它并捕获异常。我不确定如何处理单一精度。

@JonathanChan的评论很有启发性,可能比我说的任何事情都更有启发性。

但是,我什至不确定您所说的验证是什么意思。

"1.0000000000000001"是有效的浮点数吗?

val f : string = "1.0000000000000001"
# float_of_string f;;
- : float = 1.
#

没有例外表明此数字不能表示为与 1.0 不同。

如果忽略精度问题,则像字符串操作一样针对可表示范围进行测试可能并不困难。

正如@JonathanChan指出的那样,最好的答案可能取决于你需要有多确定(以及你想要确定的确切内容(。

最新更新