解析微小和非常大的浮点值:编程语言比较 - Daniel Lemire 的博客

主要观点:大多数编程语言支持浮点数,能将字符串转为浮点数,但字符串通常不能精确表示,如“1e-1000”太小,“1e1000”太大,多数语言将其表示为 0 和“infinity”。
关键信息:

  • Python 中,float("1e-1000")为 0.0,float("1e1000")为 inf。
  • Go 语言中,strconv.ParseFloat("1e-1000", 64)结果为 0,strconv.ParseFloat("1e1000", 64)结果为 inf 且触发错误(可忽略)。
  • C 语言中,strtod函数对“1e-1000”和“1e1000”处理为范围错误,分别得到 0.000000 和 inf。
  • C++中:在 LLVM/libc++下代码不构建,因缺少浮点数解析支持;在 Visual Studio 下与 C 相同;GCC/glibc++依赖[fast_float 库],添加特殊处理,解析时丢弃值,无法区分“1e1000”和“1e-1000”,均为“out of range”值,初始化变量时为-1;有趣的是,GCC/glibc++和 Microsoft Visual Studio 解析字符串“inf”时会返回 infinity 且不触发范围错误。
阅读 12
0 条评论