4

私がフロートを持っているとしましょう。この Float の小数部分の最初の 32 ビットが必要ですか? 具体的には、sha256疑似コードのこの部分を機能させることを検討しています(ウィキペディアから

# Note 1: All variables are unsigned 32 bits and wrap modulo 232 when calculating
# Note 2: All constants in this pseudo code are in big endian

# Initialize variables
# (first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19):
h[0..7] := 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19

私は素朴に床 (((sqrt 2) - 1) * 2^32) を実行してから、返された整数を Word32 に変換しようとしました。これは正しい答えではないようです。2 ^ 32乗を掛けることで、実質的に32の場所(床の後)にシフトしたままになっていることがわかりました。明らかに、そうではありません。とにかく、長くて短いですが、 h[0..7] を生成するにはどうすればよいですか?

4

1 に答える 1

5

h[0..7] を取得する最良の方法は、ウィキペディアのページから 16 進数の定数をコピーすることです。そうすれば、正しいものが得られることがわかります。

しかし、本当にそれらを計算したい場合:

scaledFrac :: Integer -> Integer
scaledFrac x =
    let s = sqrt (fromIntegral x) :: Double
    in  floor ((s - fromInteger (floor s)) * 2^32)

[ printf "%x" (scaledFrac i) | i <- [2,3,5,7,11,13,17,19] ]
于 2011-05-08T07:37:23.443 に答える