【发布时间】:2018-01-03 20:44:15
【问题描述】:
我有一个匹配以下正则表达式 \-?[0-9]*\.[0-9]+ 的字符串,它应该代表一个 IEEE 浮点数。它可以是单精度或双精度,我提前知道类型。我需要检查它是否可以被解释为给定精度的有效值。比如:
val is_valid_float: string -> bool
val is_valid_double: string -> bool
对于双精度数字,我可以使用 float_of_string 解析它并捕获异常。我不确定如何处理单精度。
【问题讨论】:
-
我想知道你能不能乱用
Int32.bits_of_float?去检查。 -
一些初步测试表明,如果
float超出范围,Int32.float_of_bits (Int32.bits_of_float float))将给出infinity。检查 OCaml 源代码。 -
OCaml 源代码仅依赖于 C 从双精度数到浮点数的转换(请参阅
byterun/ints.c中的caml_int32_bits_of_float_unboxed。C 规范只是说要使用 IEEE 规范的转换,但这个过程似乎很复杂(见stackoverflow.com/a/16737725/252042)。有人可能会假设Int32.float_of_bits (Int32.bits_of_float float))确实应该是身份,如果float可以表示为单精度浮点数,但我不是专家,并且假设它看起来可能很危险,具体取决于如何确定你需要关注这个!
标签: floating-point ocaml ieee-754 single-precision