Floating point 为什么是';无穷大';Erlang'中不允许使用;什么是浮子?

Floating point 为什么是';无穷大';Erlang'中不允许使用;什么是浮子?,floating-point,erlang,elixir,precision,Floating Point,Erlang,Elixir,Precision,Erlang(扩展为Elixir)支持浮点数 一些可能的浮动: 1.2345 1.0e10 1.0e-42 Erlang支持NaN(NaN.在Erlang中)(但是我还没有发现一种输出NaN本身的方法) 但是,Erlang不支持无限。虽然像IEEE-754这样的通用标准规定,在执行1.0/0.0之类的操作时,应该返回无穷大,但Erlang会抛出一个错误的算术错误 当尝试创建“太大”的浮动(如1.0e400)时,也会发生同样的情况 这背后可能有一些(历史的?)原因。查看。/erts/emula

Erlang(扩展为Elixir)支持浮点数

一些可能的浮动:

  • 1.2345
  • 1.0e10
  • 1.0e-42
Erlang支持NaN(
NaN.
在Erlang中)(但是我还没有发现一种输出
NaN
本身的方法)

但是,Erlang不支持
无限
。虽然像IEEE-754这样的通用标准规定,在执行
1.0/0.0
之类的操作时,应该返回
无穷大,但Erlang会抛出一个
错误的算术错误

当尝试创建“太大”的浮动(如
1.0e400
)时,也会发生同样的情况


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

查看。/erts/emulator/sys/unix/sys\u float.c

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

在大多数unix系统上,浮点不是按照该标准实现的 在创建Erlang时,会生成无穷大的值反而会生成fpe信号错误。

Erlang使用浮点数(不完全是IEEE 754 binary64)执行各种“坏”操作:将-0和+0合并到0,不执行+-SNAN、+-QNaN、+-denormals或+-Infinity

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

参考:


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

Erlang既不支持NaN,也不支持无穷大-看起来您得到的是atom
NaN
,而不是浮点。我不知道为什么Erlang不支持这些值,但是。。。