Gleitpunktarithmetik und Reproduzierbarkeit

8

Ist IEEE-754-Arithmetik auf verschiedenen Plattformen reproduzierbar?

Ich habe einen in R geschriebenen Code getestet, der Zufallszahlen verwendet. Ich dachte, dass das Setzen des Samens des Zufallszahlengenerators auf allen getesteten Plattformen die Tests reproduzierbar machen würde, aber dies scheint nicht für rexp() zu gelten, das exponentiell verteilte Zufallszahlen erzeugt.

Das bekomme ich bei 32 Bit Linux:

%Vor%

und das ist, was ich auf 64-Bit OSX 10.9 bekomme:

%Vor%

64-Bit-Linux liefert die gleichen Ergebnisse wie 64-Bit-OSX, also scheint dies ein 32-Bit-64-Bit-Problem zu sein.

Nehmen wir an, dass beide R-Versionen mit der gleichen GCC-Version kompiliert wurden und dieselben Kompilierungs-Flags (Standard R) aufweisen, die den Compiler auf IEEE-754-Arithmetik setzen.

Meine Frage ist, kann dies als ein Fehler in R betrachtet werden? Oder ist es nur eine "normale" Konsequenz der Verwendung von Gleitkommaarithmetik mit endlicher Genauigkeit?

Ich habe die gleiche Frage an die R-devel-Mailingliste geschickt, aber keine Antwort auf die Liste bekommen, und nur eine Antwort privat, um mich davon zu überzeugen, dass dies kein Fehler ist und ich damit leben sollte.

Das sagt IEEE-754 zur Reproduzierbarkeit (aus Wikipedia):

  

Die IEEE 754-1985 erlaubte viele Variationen in Implementierungen (wie z   die Kodierung einiger Werte und die Erkennung bestimmter Ausnahmen).   IEEE 754-2008 hat viele von diesen verschärft, aber ein paar Variationen   immer noch (vor allem für Binärformate). Die Reproduzierbarkeit   Klausel empfiehlt, dass Sprachstandards ein Mittel zur Verfügung stellen sollten   schreibe reproduzierbare Programme (d. h. Programme, die dasselbe erzeugen werden)   Ergebnis in allen Implementierungen einer Sprache) und beschreibt, was benötigt wird   getan werden, um reproduzierbare Ergebnisse zu erzielen.

Und das steht unter "Empfehlungen".

Meine (subjektive) Meinung ist, dass dies ein Fehler ist, weil der ganze Punkt des IEEE-754-Standards eine reproduzierbare, plattformunabhängige Gleitkommaarithmetik hat.

    
Gabor Csardi 19.01.2014, 01:56
quelle

1 Antwort

18

Es gibt Probleme mit der Reproduzierbarkeit von sogar elementaren Gleitkommaoperationen in Hochsprachen, aber sie sind normalerweise mit verschiedenen plattformspezifischen Operationen steuerbar, wie z. B. das Setzen von Compiler-Schaltern, die Verwendung von benutzerdefiniertem Code zum Setzen von Gleitkomma-Steuerungen und -modi, oder, wenn notwendig, schreiben Sie wesentliche Operationen in der Versammlung. Wie in Kommentaren entwickelt, kann das spezifische Problem, auf das Sie gestoßen sind, darin bestehen, dass verschiedene C-Implementierungen eine unterschiedliche Genauigkeit zum Auswerten von Gleitkommaausdrücken verwenden. Oft kann dies durch Compiler-Schalter gesteuert werden, oder indem Umwandlungen und Zuordnungen in die Ausdrücke eingeschlossen werden, um eine Rundung auf den nominalen Typ zu erfordern (wodurch überflüssige Genauigkeit verworfen wird).

Die komplizierteren Funktionen wie exp und cos sind jedoch auf verschiedenen Plattformen nicht routinemäßig reproduzierbar. Obwohl der IEEE-754-Standard 2008 empfiehlt, dass diese Funktionen mit einer korrekten Rundung implementiert werden, wurde diese Aufgabe für keine mathematische Bibliothek mit bekannter Laufzeit abgeschlossen. Niemand auf der Welt hat die Mathematik dafür getan.

Das CRlibm-Projekt hat einige der Funktionen mit bekannten Laufzeitgrenzen implementiert, aber die Arbeit ist unvollständig. (Laut Pascal Cuoqs Kommentar, wenn CRlibm keine nachgewiesene Laufzeitgrenze für die korrekte Rundung hat, fällt es auf ein Ergebnis zurück, das sehr wahrscheinlich korrekt gerundet wird, da es mit sehr hoher Genauigkeit berechnet wird.) Herausfinden, wie man korrekt liefert -rounded führen zu einer begrenzten Zeit und beweisen, dass es für viele Funktionen schwierig ist. (Überlegen Sie, wie Sie beweisen könnten, dass kein Wert von cos(x) , wo x irgendein double -Wert ist, näher als ein kleiner Abstand e vom Mittelpunkt zwischen zwei darstellbaren Werten ist. Der Mittelpunkt ist wichtig, weil er wo ist Das Runden muss sich von der Rückgabe eines Ergebnisses zur Rückgabe eines anderen ändern, und e sagt Ihnen, wie genau und genau Sie eine Approximation berechnen müssen, um eine korrekte Rundung zu erreichen.)

Der gegenwärtige Stand der Dinge ist, dass viele der Funktionen in der Mathebibliothek approximiert sind, eine gewisse Genauigkeit, die loser ist als eine korrekte Rundung, geliefert wird, und verschiedene Anbieter verwenden unterschiedliche Implementierungen mit unterschiedlichen Annäherungen. Ich nehme an, dass R einige dieser Funktionen in seiner rexp -Implementierung verwendet und dass es die nativen Bibliotheken seiner Zielplattformen verwendet, so dass es auf verschiedenen Plattformen zu unterschiedlichen Ergebnissen kommt.

Um dies zu beheben, können Sie eine gemeinsame mathematische Bibliothek auf den Zielplattformen verwenden (möglicherweise CRlibm).

    
Eric Postpischil 19.01.2014, 02:04
quelle

Tags und Links