2015-12-10 8 views
7

Ich bemerkte, dass Haskell (ghci 7.10.2 von Haskell Platform unter Windows) das Zeichen auf QNAN (0/0 :: Double) von dem, was ich in C++ gesehen habe (getestet MSVS C++ 2013 und cygwin gcc 4.9) .2). Haskell erzeugt das Bitmuster 0xfff8000000000000 für (0/0) (und - (0/0) erzeugt 0x7ff8 ...). Dies ist rückwärts von C++ Implementierungen zu tun scheinen.Haskell setzt (0/0) als qnan

Hier ist ein Testprogramm zu veranschaulichen:

import Data.Word 
import Unsafe.Coerce 
import Text.Printf 

dblToBits :: Double -> Word64 
dblToBits = unsafeCoerce 

test :: Double -> IO() 
test d = putStrLn $ printf "%12f  0x%x" d (dblToBits d) 

go = do 
    test (0/0) 
    test (-(0/0)) 
    test (1/0) 
    test (-(1/0)) 

Dies ergibt die Ausgabe:

 NaN  0xfff8000000000000 <- I expect 0x7F...? 
     NaN  0x7ff8000000000000 <- I expect 0xFF...? 
Infinity  0x7ff0000000000000 
-Infinity  0xfff0000000000000 

Hinweis, die Unendlichkeiten in Ordnung arbeiten, aber die Nans gekippt zu sein scheinen.

  • Ist dieser Teil der undefinierten Semantik von NaN in Haskell? I.e. (0/0) bedeutet, dass ghc das gewünschte NaN-Muster verwenden kann? Dann haben wir in Haskell einen präzisen Weg, um QNAN oder SNAN im Fließkomma-Punkt zu spezifizieren, ohne auf spezielle IEEE-Bibliotheken zurückgreifen zu müssen 4? Ich schreibe einen Assembler für ein Stück Hardware, das wählerisch sein könnte, wenn es um NaN geht.

  • Werde ich von unsafeCoerce verbrannt? Ich habe keine einfach Weg in Haskell von Float zu Bits und zurück zu konvertieren.

LITERATUR:

  1. MSVS 2013. Die C++ std::numeric_limits<double>::quiet_NaN() von < Grenzen>0x7ff8000000000000 gibt. Auch getestet auf Cygwin gcc 4.9.2
  2. std::numeric_limits::quiet_NaN. Gibt an, dass jede Bedeutung des Vorzeichenbits eine Implementierung definiert ist. Hat Haskell eine ähnliche Regel?
  3. Perl semantics sind konsistent mit MSV C++
  4. Mögliche Haskell library für IEEE
  5. leicht im Zusammenhang question die gleiche unsafeCoerce Nicht-Sinn verwendet, die ich fiel zurück.

Antwort

5

Sie fragen zu viel von Ihren NaNs. Gemäß dem IEEE-Standard kann das Vorzeichenbit auf einem NaN alles sein. So können die Compiler-, Prozessor- oder Gleitkomma-Bibliotheken beliebige Entscheidungen treffen, und Sie erhalten unterschiedliche Ergebnisse für verschiedene Compiler, Prozessoren und Bibliotheken.

Insbesondere bei einem Programm wie diesem kann die konstante Faltung bedeuten, dass die Operationen vom Compiler statt in der Zielumgebung ausgeführt werden, je nachdem, wie der Compiler ausgeführt wird. Der Compiler kann native Fließkommaanweisungen verwenden oder stattdessen etwas wie GMP oder MPFR verwenden. Dies ist nicht ungewöhnlich. Da der IEEE-Standard nichts über Zeichen-Bits aussagt, werden Sie unterschiedliche Werte für verschiedene Implementierungen erhalten. Ich wäre nicht ganz überrascht, wenn Sie zeigen könnten, dass sich die Werte geändert haben, als Sie die Optimierungen ein- oder ausgeschaltet haben, und das ist nicht einschließlich Dinge wie -ffast-math.

Als Beispiel für eine Optimierung, der Compiler weiß, dass Sie eine NaN berechnen, und vielleicht entscheidet es sich nicht zu stören, das Zeichen Bit nachher spiegeln.Dies alles geschieht durch konstante Ausbreitung. Ein anderer Compiler führt diese Art von Analyse nicht durch, und so gibt er eine Anweisung aus, um das Zeichenbit umzudrehen, und die Leute, die Ihren Prozessor gemacht haben, machen diese Operation nicht anders für NaNs.

Kurz gesagt, versuchen Sie nicht, das Vorzeichenbit auf einem NaN zu verstehen.

Was genau möchten Sie hier erreichen?

+0

Dies ist, was ich graben wollte. Ich denke, dass das Zeichen-Bit, das nicht in einem NaN für IEEE definiert ist, genug ist, um mich davon zurückzuziehen und das auf andere Weise zu lösen. – Tim

+0

Was versuchen Sie zu lösen? –

+0

Grundsätzlich hatte ich Werkzeug A und Werkzeug B, die beide "Nan" in ein Bitmuster in einer Befehlskodierung umwandeln. Die Hardware sollte beides handhaben, aber um Werkzeug A mit Werkzeug B zu testen, müssen sie die gleichen Bits erzeugen. Daher muss ich mich mit Dingen beschäftigen, die hinter der normalen Abstraktionsgrenze liegen. – Tim

Verwandte Themen