strtod 很疯狂!

主要观点:

  • 介绍了 C 标准库中的strtod函数,它能将十进制数转换为二进制浮点数,看似简单实则实现起来困难,需处理各种复杂情况。
  • strtod函数接口无输入字符串大小限制,处理整数和浮点数情况复杂,包括多种表示方式、精度问题和舍入规则等。
  • 实现strtod需使用任意精度算术代码,常见实现多基于 David M. Gay 的工作,也有其他不同 lineage 的实现,如 Google 的 double-conversion 等。
  • 作者在研究任意精度算术时遇到此问题,其游戏中因需无限缩放需用整数来精确跟踪位置,避免了更复杂的运算。

关键信息:

  • strtod函数原型double strtod(const char *beginptr, char **endptr)
  • 处理的复杂情况如多种表示方式(1000 = 100e1 =...)、精度问题(任意小的额外量可改变结果)、舍入规则等。
  • 常见strtod实现多基于 David M. Gay 的工作,如 FreeBSD、Apple 等的代码,还有 Google 的 double-conversion、Go 和 Rust 中的 Eisel-Lemire 算法、fast_float 库等。
  • 作者游戏中因无限缩放需用整数进行精确位置跟踪,避免了更复杂运算。

重要细节:

  • 对于整数转换,有一些简单的边缘情况如12340000000…00000…00000123
  • strtod代码中使用了任意精度整数类型 Bigint,最坏情况可能分配无界内存,且一些实现未检查内存溢出。
  • 提到一些相关讨论的链接如 Hacker News 和 Lobsters,以及相关的脚注信息如原始论文的存档链接等。
阅读 13
0 条评论