为什么 'Infinity' 不允许出现在 Erlang 的浮点数中?

Why is 'Infinity' not allowed in Erlang's floats?

Erlang(以及扩展名 Elixir)支持浮点数。

一些可能的花车:

Erlang 支持 NaN(Erlang 中的 nan.)(但是我还没有发现一种输出 nan 本身的方法)。

但是,Erlang 不支持 Infinity。虽然 IEEE-754 等通用标准规定在执行 1.0/0.0 时应该 return Infinity,但 Erlang 会抛出 bad arithmetic error.

尝试制作 'too large' 类似 1.0e400 的浮点数时也会发生同样的情况。

这背后可能有一些(历史?)原因。

正在查找 ./erts/emulator/sys/unix/sys_float.c

在我看来,Erlang 正在使用底层 strtod 实现转换为 "standard" C 浮点数。

在大多数 unix 系统上,浮点数并未按照该标准实现 在创建 Erlang 时,但会生成 Infinity 的值会生成 fpe 信号错误。

Erlang 用浮点数做各种 "bad" 事情(不完全是 IEEE 754 binary64):将 -0 和 +0 合并为 0,不做 +-SNaNs、+-QNaNs、+-denormals或 +-无穷大。

对于具有精确错误处理的实际科学计算,使用 Port、执行一些 RPC 或编写 C/C++ NIF 可能值得使用另一种语言。

参考:http://steve.hollasch.net/cgindex/coding/ieeefloat.html

更新:我写了一个简单的 ieee754 模块here,它对 binary64 浮点数进行分类并转换 Erlang 支持的浮点数。