【发布时间】:2013-03-21 17:42:36
【问题描述】:
我正在尝试用 C 编写一个解析器,它的部分工作是将一系列字符转换为双精度字符。到目前为止,我一直在使用 strtod,但我发现它非常危险,它不会处理数字位于缓冲区末尾的情况,这不是空终止的。
我想我会自己写。如果我有一个 a.b 形式的数字的字符串表示,我会不会认为我可以计算 (double)a + ((double)b / (double)10^n),其中 n 是b中的数字?
例如,23.4563:
a = 23 b = 4563
最终答案:23 + (4563/10000)
或者对于 IEEE 格式的浮点数会产生不准确的结果?
【问题讨论】:
-
一方面,如果
b是整数类型,b / 10^n将在被转换为float之前进行四舍五入。你想把演员 inside 括号。此外,您需要确保a或b中没有整数溢出。 -
对不起,是的,你是对的 - 我的错字。我会编辑它。
-
更多思考:负数,指数格式
1.2E10。负指数,...我真的建议你只是复制到一个空终止的缓冲区,让 strtod 做繁重的工作。 -
计算
a + b/10000.f不会总是产生正确的舍入结果。 (出于这些目的,“正确舍入的结果”是最接近数学值的结果。)例如“1.0097”。1 + 97/10000.f产生 1.0097000598907470703125,但更接近和正确的float是 1.00969994068145751953125。出现不正确的结果是因为除法中有一个舍入,加法中有另一个舍入。除法中的舍入丢失了显示在加法中需要其他值的信息。 -
您的问题是说您的工作是转换为 double,但在其他地方指的是转换为 float。你应该明确你想要生产什么类型。
标签: c floating-point