为什么 'Infinity' 不允许出现在 Erlang 的浮点数中?
Why is 'Infinity' not allowed in Erlang's floats?
Erlang(以及扩展名 Elixir)支持浮点数。
一些可能的花车:
1.2345
1.0e10
1.0e-42
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 支持的浮点数。
Erlang(以及扩展名 Elixir)支持浮点数。
一些可能的花车:
1.2345
1.0e10
1.0e-42
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 支持的浮点数。