我需要使用OCaml在C代码中解析浮点文字。
OCaml的浮点类型是64位。我有文字的字符串,其数值四舍五入到64位及其种类(浮点数,双倍或长双数)。
问题是数值大于64位的文字:
OCaml的arbitrary-precision module可以解析像“123/123”这样的字符串中的有理数,但不能解析它们可能出现在C中的“123.123”,“123e123”,“0x1.23p-1”。
背景:我使用CIL来评估C程序的分析。
任何大小的双重文字和具有适合64位的数值的浮点文字始终正确表示。通过从双精度到单精度的舍入,我也可以重现double rounding errors。
答案 0 :(得分:2)
总结一些要点:您可以从OCaml接口strtold()
和strtof()
。对于前者,您必须考虑如何存储它产生的结果,因为只有long double
在主机体系结构上大于double
时才会有一个点。仍然存在这样的问题:这些函数在最广泛使用的C库之一中是错误的。非常轻微的马车,但是如果您正在研究双舍入,那么确切地感兴趣的例子就会出错。
另一种方法是编写自己的函数,从您引用的博客中的another post开始。
最后,在评论中使用的短语“即使获得单精度浮点数需要我解析值大于64位的文字”仍然是一种奇怪的方式。在将单精度浮点数表示为单精度浮点数之前,可以解析单精度浮点数表示的中间格式必须无损,否则会出现双舍入。根据有损中间格式的精度,双舍入可能或多或少难以展示,但使用80位或128位二进制浮点格式不会消除问题,只是使其更加微妙。在我推荐的简单算法中,中间格式是两个多精度整数的一小部分。
答案 1 :(得分:0)
我在这个问题中没有看到问题:)
假设你需要一个ocaml解析器用于“C float literals” - 答案是 - 自己编写一个,这不是很难,你将严格控制实现细节和“C float literal”实际意味着什么。