C 编写自己的浮点解析器

C 编写自己的浮点解析器,c,floating-point,C,Floating Point,我正在尝试用C编写一个解析器,它的部分工作是将一系列字符转换成双精度字符。到目前为止,我一直在使用strtod,但我发现它非常危险,它不会处理数字位于缓冲区末尾的情况,缓冲区不是以null结尾的 我想我会自己写的。如果我有一个a.b形式的数字的字符串表示,我会不会觉得我可以计算(double)a+((double)b/(double)10^n),其中n是b中的位数 例如,23.4563: a=23 b=4563 最终答案:23+(4563/10000) 或者,这会导致IEEE浮点数格式的结果不准

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

我想我会自己写的。如果我有一个a.b形式的数字的字符串表示,我会不会觉得我可以计算(double)a+((double)b/(double)10^n),其中n是b中的位数

例如,23.4563:

a=23 b=4563

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


或者,这会导致IEEE浮点数格式的结果不准确吗?

要准确读取浮点数是很困难的,因为有各种各样的问题必须认真解决,而许多人都没有做到这一点。然而,这是一个已解决的问题。首先,请参见

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

您可能会感兴趣

该答案中的解析器将十进制浮点数(表示为字符串)转换为IEEE-754浮点数,并通过适当的舍入进行双精度运算

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


否则,它会给你一个好主意去做什么(如果你对你正在做的事情有任何想法:)。

正如前面所说的,这很难,你需要额外的精确度,等等

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


首先,如果
b
是一个整数类型,
b/10^n
将在被转换为
float
之前进行四舍五入。你应该把演员阵容放在括号里。此外,您还需要确保
a
b
中没有整数溢出。对不起,是的,您是对的-我的输入错误。我会编辑它。更多要考虑的:负数,指数格式
1.2E10
。负指数,。。。我真的建议您只需复制到一个以null结尾的缓冲区中,让strod来完成繁重的工作。计算
a+b/10000.f
并不总能产生正确的四舍五入结果。(出于这些目的,“正确四舍五入结果”是最接近数学值的结果。)例如“1.0097”
1+97/10000.f
生成1.0097000598907470703125,但更接近且正确的浮动
为1.00969994068145751953125。由于除法中有一个四舍五入,加法中有另一个四舍五入,因此会出现错误的结果。除法中的四舍五入会丢失显示加法中需要的其他值的信息。您的问题是您的工作是转换为双精度,但其他地方指的是转换为浮动。你应该弄清楚你想生产什么类型的。代码不错。不过有一句话:你说“当指数部分太大(不适合整数)时,应该等于返回错误或INF。”这很有趣,因为我也编写了自己的十进制到浮点函数(比你的函数短,因为我可以依赖现有的bigint实现),我犯了和你一样的错误,也就是说,假设一个指数太大,不适合整数,这意味着浮点是无限的。链接处的文件不见了。archive.org仍然保留着它:它似乎是“如何准确读取浮点数”。作者:William D.Clinger@Caesar:谢谢,更新。