编写我自己的浮点解析器

时间:2013-03-21 17:42:37

标签: c floating-point

我正在尝试用C编写解析器,其部分工作是将一系列字符转换为double。到目前为止,我一直在使用strtod,但我发现它非常危险,并且它不会处理数字位于缓冲区末尾的情况,它不会以空值终止。

我以为我会写自己的。如果我有一个表格形式为ab的字符串表示,我会认为我可以计算(加倍)a +((double)b /(double)10 ^ n),其中n是数字b中的数字?

例如,23.4563:

a = 23   b = 4563

最终答案:23 +(4563/10000)

或者就浮动的IEEE格式产生不准确的结果?

3 个答案:

答案 0 :(得分:3)

很难准确地读取浮点数,因为存在必须仔细解决的各种问题,并且很多人都没有这样做。但是,这是一个解决的问题。首先,请参阅this paper

我同意Roddy的观点,你最好将数据复制到缓冲区并使用现有的库函数。 (但是,您应该检查您的C实现是否提供了正确的浮点数的舍入转换.C标准不要求它,并且某些实现不提供它。)

答案 1 :(得分:1)

您可能对this answer of mine to a somewhat related question感兴趣。

该答案中的解析器将十进制浮点数(表示为字符串)转换为IEEE-754浮点数,并通过适当的舍入来加倍。

据我记忆,关于代码中唯一的问题是,当指数部分太大(不适合整数)时,它可能无法处理这些情况,并且应该等于返回错误或{ {1}}。

否则,它应该让你知道该怎么做(如果你对你正在做的事情有任何想法:)。

答案 2 :(得分:1)

如前所述,这很难,你需要额外的精确度等等......

但是如果你有限制输入,并想知道你是否仍然可以使用半天真算法和标准IEEE 754操作将这些受限制的十进制正确转换为二进制,你可能会对我的回答感兴趣

How to manually parse a floating point number from a string