Как мне преобразовать первые 32 бита дробной части Float в Word32? - PullRequest
4 голосов
/ 08 мая 2011

Скажи, у меня есть поплавок. Я хочу первые 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

Я наивно пытался выполнить слово floor (((sqrt 2) - 1) * 2 ^ 32), а затем преобразовать возвращенное целое число в Word32. Это совсем не похоже на правильный ответ. Я полагал, что, умножив на 2 ^ 32 силы, я фактически сдвинул его на 32 места (после пола). Очевидно, дело не в этом. Как бы то ни было, как я могу сгенерировать h [0..7]?

1 Ответ

5 голосов
/ 08 мая 2011

Лучший способ получить h [0..7] - скопировать шестнадцатеричные константы со страницы Википедии.Таким образом, вы знаете, что у вас будут правильные.

Но если вы действительно хотите их вычислить:

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] ]
...