Warum ist 'Infinity' in Erlangs Schwimmern nicht erlaubt?

8

Erlang (und nach Erweiterung Elixir) unterstützt Fließkommazahlen.

Einige mögliche Floats:

  • 1.2345
  • 1.0e10
  • 1.0e-42

Erlang unterstützt NaN ( nan. in Erlang) (ich muss jedoch noch eine Methode finden, die nan selbst ausgibt).

Erlang hat jedoch keine Unterstützung für Infinity . Während gängige Standards wie IEEE-754 angeben, dass man Infinity zurückgeben soll, wenn man zB 1.0/0.0 macht, wirft Erlang ein bad arithmetic error .

Dasselbe passiert, wenn man versucht, Floats zu erstellen, die wie 1.0e400 zu groß sind.

Es gibt wahrscheinlich einen (historischen?) Grund dafür.

    
Qqwy 28.06.2016, 15:37
quelle

2 Antworten

3

Erlang macht alle möglichen "schlechten" Dinge mit floats (nicht ganz IEEE 754 binary64): conflate -0 und +0 bis 0, nicht + -SNaNs, + -QNaNs, + -denormals oder + -infinity .

Für tatsächliche, wissenschaftliche Berechnungen mit präziser Fehlerbehandlung lohnt es sich wahrscheinlich, in eine andere Sprache zu wechseln, entweder mit Port , etwas RPC zu machen oder C / C ++ NIF zu schreiben.

Referenz: Ссылка

Update: Ich schrieb ein triviales ieee754-Modul hier , das binary64-Floats klassifiziert und diese konvertiert dass Erlang unterstützt.

    
Barry 13.04.2017, 03:40
quelle
5

Suchen in ./erts/emulator/sys/unix/sys_float.c

Es scheint mir, dass Erlang die zugrunde liegende Implementierung von strtod benutzt, um in "Standard" C-Floats zu konvertieren.

Auf den meisten Unix-Systemen wurde der Gleitkomma-Punkt nicht in diesen Standard implementiert Zu der Zeit, als Erlang erstellt wurde, generieren Werte, die Infinity generieren würden, stattdessen fpe-Signalfehler.

    
quelle