从字符串解析long double

时间:2011-11-12 01:49:15

标签: parsing floating-point ocaml static-analysis

我需要使用OCaml在C代码中解析浮点文字。

OCaml的浮点类型是64位。我有文字的字符串,其数值四舍五入到64位及其种类(浮点数,双倍或长双数)。

问题是数值大于64位的文字:

  1. long double literals
  2. 浮动带有'f'后缀的文字,如果它们没有后缀,就会发生双舍入错误。
  3. OCaml的arbitrary-precision module可以解析像“123/123”这样的字符串中的有理数,但不能解析它们可能出现在C中的“123.123”,“123e123”,“0x1.23p-1”。

    背景:我使用CIL来评估C程序的分析。

    任何大小的双重文字和具有适合64位的数值的浮点文字始终正确表示。通过从双精度到单精度的舍入,我也可以重现double rounding errors

2 个答案:

答案 0 :(得分:2)

我以blog post

的形式写了我的答案

总结一些要点:您可以从OCaml接口strtold()strtof()。对于前者,您必须考虑如何存储它产生的结果,因为只有long double在主机体系结构上大于double时才会有一个点。仍然存在这样的问题:这些函数在最广泛使用的C库之一中是错误的。非常轻微的马车,但是如果您正在研究双舍入,那么确切地感兴趣的例子就会出错。

另一种方法是编写自己的函数,从您引用的博客中的another post开始。

最后,在评论中使用的短语“即使获得单精度浮点数需要我解析值大于64位的文字”仍然是一种奇怪的方式。在将单精度浮点数表示为单精度浮点数之前,可以解析单精度浮点数表示的中间格式必须无损,否则会出现双舍入。根据有损中间格式的精度,双舍入可能或多或少难以展示,但使用80位或128位二进制浮点格式不会消除问题,只是使其更加微妙。在我推荐的简单算法中,中间格式是两个多精度整数的一小部分。

答案 1 :(得分:0)

我在这个问题中没有看到问题:)

假设你需要一个ocaml解析器用于“C float literals” - 答案是 - 自己编写一个,这不是很难,你将严格控制实现细节和“C float literal”实际意味着什么。