4

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

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

例如,23.4563:

a = 23 b = 4563

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

或者这会对 IEEE 格式的浮点数产生不准确的结果?

4

3 回答 3

4

浮点数很难准确读取,因为有很多问题需要仔细解决,而且很多人都做不到。然而,这是一个已解决的问题。首先,请参阅William D. Clinger 于 1990 年 6 月出版的How to read floating point numbers

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

于 2013-03-21T18:19:23.000 回答
1

您可能对我对某个相关问题的回答感兴趣。

该答案中的解析器将十进制浮点数(表示为字符串)转换为 IEEE-754 浮点数和适当舍入的双精度数。

据我记得,代码中唯一的问题是它可能无法处理指数部分太大(不适合整数)并且应该返回错误或返回的情况INF

否则,它应该让您对要做什么有一个很好的了解(如果您对自己在做什么有任何想法:)。

于 2013-03-21T20:42:18.547 回答
1

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

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

如何从字符串中手动解析浮点数

于 2013-03-21T23:02:33.077 回答