为什么' Infinity'在Erlang的花车里不允许?

时间:2016-06-28 15:37:56

标签: floating-point erlang elixir precision

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

一些可能的浮动:

  • 1.2345
  • 1.0e10
  • 1.0e-42

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

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

当试图制作太大的浮子时会发生同样的情况。比如1.0e400

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

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,它对binary64浮点数进行了分类并转换了Erlang支持的模块。