为什么Erlang的浮点数不允许使用“Infinity”?

11

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时,也会出现相同的情况。

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


7
Erlang不支持NaN和无穷大,看起来你得到的是原子nan,它不是浮点数。我不知道为什么Erlang不支持这些值... - legoscia
2个回答

6

查看 ./erts/emulator/sys/unix/sys_float.c 文件,我发现Erlang使用底层的strtod实现将值转换为“标准”C浮点数。

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


5
Erlang在浮点数方面做了各种“不好”的事情(不完全符合IEEE 754二进制64位):将-0和+0混淆为0,不处理+-SNaN、+-QNaN、+-denormal或+-infinity。
对于实际的、科学计算需要精确误差处理的情况,最好使用另一种语言,可以通过Port、进行一些RPC或编写C/C++ NIF来实现。
参考:http://steve.hollasch.net/cgindex/coding/ieeefloat.html 更新:我在这里写了一个微不足道的ieee754模块here,它分类了binary64浮点数并转换了Erlang支持的那些。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接