【问题标题】:Why is 'Infinity' not allowed in Erlang's floats?为什么 Erlang 的浮点数中不允许使用“Infinity”?
【发布时间】:2016-10-31 00:56:16
【问题描述】:

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

一些可能的浮动:

  • 1.2345
  • 1.0e10
  • 1.0e-42

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

但是,Erlang 不支持Infinity。虽然像 IEEE-754 这样的通用标准规定在执行 1.0/0.0 之类的操作时应该返回 Infinity,但 Erlang 会抛出 bad arithmetic error

尝试制作像1.0e400 这样“太大”的浮点数时也会发生同样的情况。

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

【问题讨论】:

  • Erlang 既不支持 NaN 也不支持无穷大 - 看起来你有原子 nan 代替,它不是浮点数。不过,我不知道为什么 Erlang 不支持这些值……

标签: floating-point erlang elixir precision


【解决方案1】:

查看 ./erts/emulator/sys/unix/sys_float.c

在我看来,Erlang 正在使用底层的 strtod 实现来转换为“标准”C 浮点数。

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

【讨论】:

    【解决方案2】:

    Erlang 用浮点数做了各种“坏”的事情(不完全是 IEEE 754 binary64):将 -0 和 +0 混为 0,不做 +-SNaNs、+-QNaNs、+-denormals 或 +-infinity .

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 2015-02-19
      • 2010-10-01
      • 1970-01-01
      • 2011-05-14
      相关资源
      最近更新 更多