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

时间:2017-07-27 22:59:37

标签: floating-point ocaml ieee-754 single-precision

我有一个匹配以下正则表达式\-?[0-9]*\.[0-9]+的字符串,它应该代表一个IEEE浮点数。它可以是单精度或双精度,我提前知道类型。我需要检查它是否可以被解释为给定的精确值中的有效值。类似的东西:

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

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

1 个答案:

答案 0 :(得分:0)

@ JonathanChan的评论很有启发性,可能比我说的更多。

但是,我甚至不确定验证的含义。

是" 1.0000000000000001"有效的浮动?

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

没有例外表明此号码不能表示为与1.0不同。

如果忽略精度问题,可能就不像字符串操作那样测试可表示的范围。

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