【问题标题】:IEEE 64 and 32 bit float validation in OCamlOCaml 中的 IEEE 64 和 32 位浮点验证
【发布时间】: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


【解决方案1】:

@JonathanChan 的 cmets 很有启发性,可能比我说的任何话都更有启发性。

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

“1.0000000000000001”是一个有效的浮点数吗?

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

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

如果您忽略精度问题,则可能不难将可表示范围作为字符串操作进行测试。

正如@JonathanChan 指出的那样,最佳答案可能取决于您需要确定的程度(以及您想要确定的确切内容)。

【讨论】:

  • 可表示的范围从 -∞ 到 +∞,因为这些值可用于单精度和双精度。可能需要检查字符串中的值是否可以精确表示(到 24/53 有效位)而不是 +inf-inf。这是通过检查转换结果是否无限来完成的。
  • 不错。因此,似乎不会为词法有效的字符串捕获异常。
  • 但是,您似乎需要另一种单精度浮点方法,因为它在 OCaml 中没有表示形式。
  • 我的方法是将单精度数字表示为 OCaml float。大多数单精度操作可以用 OCaml 操作精确模拟,然后立即舍入到单精度,这个函数:github.com/TrustInSoft/tis-interpreter/blob/…。但不是从十进制解析:这需要重新实现,例如github.com/TrustInSoft/tis-interpreter/blob/…
  • 我正在尝试复制 C 编译器的行为,我希望接受它认为正确的常量。在上面的问题中,我已将其缩小到特定的正则表达式,因此我们不需要在这里处理无穷大。
猜你喜欢
  • 2013-02-16
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多