ハスケル(WindowsのHaskellプラットフォームからのghci 7.10.2)がQNAN (0/0 :: Double)
のサインをC++で見たことに気付きました(テスト済みのMSVS C++ 2013およびcygwin gcc 4.9 2)。 Haskellは(0/0)のビットパターン0xfff8000000000000
(そして - (0/0)は0x7ff8 ...を生成する)を生成する。これは、C++の実装から逆になっているようです。ここでハスケルがqnanとして(0/0)を設定する
を説明するためのテストプログラムです:
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))
これは出力が得られます。
NaN 0xfff8000000000000 <- I expect 0x7F...?
NaN 0x7ff8000000000000 <- I expect 0xFF...?
Infinity 0x7ff0000000000000
-Infinity 0xfff0000000000000
注意を、無限大は大丈夫アウト動作しますが、NaNの者が反転しているようです。
この部分は、HaskellのNaNの定義されていないセマンティクスの一部ですか?私。 (0/0)は、ghcが必要とするNaNパターンを使用できることを意味しますか?それでは、Haskellで特殊なIEEEライブラリ4に頼らずに浮動小数点でQNANまたはSNANを指定する正確な方法がありますか?私はそれがナナの味であるかもしれないと思うかもしれないハードウェアのためのアセンブラを書いています。
私は焼き付いていますか?
unsafeCoerce
?私はnoを持っていますハスケルフロートからビットとバックに変換する方法。
REFERENCES:
- MSVS 2013 <限界からC++
std::numeric_limits<double>::quiet_NaN()
>0x7ff8000000000000
を与えます。またcygwin gcc 4.9.2でテストされました - std::numeric_limits::quiet_NaN符号ビットの意味がインプリメンテーションによって定義されていることを示します。ハスケルも同様の規則を持っていますか?
- Perl semanticsはIEEE
- ためのMSV C++
- 可能なHaskellのlibraryと一致しており、わずかに関連questionは、私は戻って落ちた同じ
unsafeCoerce
非感覚を使用しています。
これは私が掘り下げたものです。私は、IEEEのNaNで定義されていない符号ビットは、私がこれを別の方法で取り除いて解決するのに十分だと思います。 – Tim
あなたは何を解決しようとしていますか? –
基本的に私は、ツールのAとツールBを持っていて、どちらも命令のエンコーディングで "nan"をいくつかのビットパターンに変換します。ハードウェアは両方を処理する必要がありますが、ツールBを使用してツールAをテストするには、同じビットを生成する必要があります。したがって、私は、通常の抽象化境界を過ぎたもので悩まなければならない。 – Tim