将字符串转换为双精度等于文字双精度?

Pet*_*sen 31 c

例如:

assert(atof("1.2") == 1.2);
Run Code Online (Sandbox Code Playgroud)

不管使用什么浮子?

我知道浮点精度并不精确,但它精确到不精确,二进制的舍入产生完全相同的双精度?

Eri*_*hil 29

C标准无法保证这一点.在源代码中转换浮点文字的语义在C 2011 [draft N1570] 6.4.4.2中规定.这表示推荐但不是必需的做法是浮点常量的转换时转换应该与库函数的字符串执行时转换相匹配,例如strtod.

更重要的是,该标准甚至不要求具有相同数学值的两个不同文字,例如1.231.230转换为相同的值.这些示例来自标准中的脚注75,该脚注是段落的脚注,表示同一源表单的所有浮点常量应转换为相同的值.因此,1.23始终在源中出现的任何位置转换为相同的值,但1.230不一定转换为与1.23或相同的值123e-2.即使123e-2123e-02可能会有所不同.

atof(p)7.22.1.2中规定的等效strtod(p, (char **) NULL)除了它们如何表现出错误.strtod在7.22.1.3中规定.该子句有一些推荐的准确性实践,但对于匹配文字的翻译时转换没有提及.

  • @WeatherVane:这是不好的建议; 请不要传播它.正确使用浮点需要专业知识,但这是可能的. (12认同)
  • @WeatherVane:你是对的,我失去了线索,与宽容相比是一种转移.问题是使用浮点相等.我在这个立场上的观点.做好工作并不简单.如果需要学习和思考,就需要学习和思考.有许多关于使用浮点的教科书,课程和论文.Mockery不是反驳. (5认同)
  • @PeterHansen你永远不应该相信浮点平等. (4认同)
  • 我找到了你,但你的论点是稻草人.我从未建议与容忍进行比较.在阅读Eric Postpischil的论文之前,不要使用浮点比较.除非你至少有MSc,否则根本不要使用浮点数. (3认同)
  • @PeterHansen:是的,或检查其文档(或源代码)或询问其实现者或供应商. (2认同)