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