2011-01-12 3 views
5

私はウィキペディアのSHA256 pseudocodeを見ています。このfloatの小数部の最初の32ビットは何ですか?

詳しくは、次のセクションを参照してください。

//Initialize variables 
//(first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19): 
h0 := 0x6a09e667 

私はh0の生成方法を理解しようとしています。コメントから、これは2の平方根の小数部分でなければならないことが分かります。次のようにタイプすることで2の平方根の小数部分を得ることができると思います。次のコードはすべてpython replのものです。

>>> math.modf(math.sqrt(2))[0] 
0.41421356237309515 

ファイルの先頭には、すべての定数の宣言がBig Endianであることが記載されています。私は入力するので私の環境はスモールエンディアンであることを知っています。

>>> import sys 
>>> sys.byteorder 
'little' 

だから、H0で進値の私の手動操作に応じて、リトルエンディアン表現は0x67e6096aでなければなりません。

>>> int(0x67e6096a) 
1743128938 

私は詰まっています。私はいろいろな操作を試みましたが、それらのどれもがこの結果に終わらない。私は、浮動小数点数の小数部の最初の32ビットを取得する方法を知らない。私は何とか私の0.41421356237309515(浮動小数点)の結果を1743128938(int)に変換できると知っていますが、どう考えているのか分かりません。浮動小数点数の小数部分の最初の32ビットを得るために必要なステップは何ですか? Pythonだけが答えます。

ありがとうございます。

答えて

8

エンディアンは16進定数ではありません。各桁はニブルであり、最下位ニブルは最後になります。異なるサイズのポインタを扱うと問題になります。バイトオーダを使用する必要がある場合は、structモジュールが役に立ちます。とにかく、小数点以下の部分だけを検索しました。進に変換することだけで簡単に掛けると切り捨てることにより行われ、私たちは、整数を取得している:

>>> hex(int(math.modf(math.sqrt(2))[0]*(1<<32))) 
'0x6a09e667' 
+0

だから、Pythonは、短い、int、long(または何でも)ではなく、 "nibblesのストリーム"として16進定数を扱うので、バイトオーダーについて心配する必要はありませんか? Pythonのリテラル16進定数を事実上常にBig Endianにすることはできませんか?愚かな質問の場合はお詫びしますが、私は簡単に混乱しています。 :) –

+0

並べ替えがありますが、これはPython固有のものではありません。それは単に数字を書いた順序です。この順序は、テキストが右から左に向かうアラビア文字から継承されていることに注意してください。その視点では、リトルエンディアンです。バイトに分割されていないので、バイトスワッピングは関係ありません。 –

6
  1. 乗算ヘクス全体の部分を表現する2^32(1779033703.9520993849027770600526)
  2. によって
  3. 小数部(0.4142135623730950488016887242097を)取る
  4. (1.4142135623730950488016887242097)(2)SQRTを計算するには、Windows上で、あなたの電卓を使用します(6A09E667)

Voila。 (Pythonの答えを出さないためにOPにお詫びしますが、私はその方法がはっきりしていることを願っています)。

+0

[OK]を、それはpythonのではありません答え、それは私に私の問題を説明した。私は、間違った部分を10^nで乗算しようとしていたことが分かりました。ここで、nは最大のnの整数です。ここで、fractional_part_of(sqrt(2))*(10^n)符号なし4バイト整数。私はその結果を取って、(フローリングで)整数を得るためにキャストしていました。ハハ、私はとてもばかげている。 –

3
>>> math.sqrt(2).hex() 
'0x1.6a09e667f3bcdp+0' 

スライス例えば、必要に応じて:

>>> '0x'+math.sqrt(2).hex().split('.')[1][:8] 
'0x6a09e667' 
+0

興味深いことに、浮動小数点数を表現するために16進数を使うことはできませんでした。今日はたくさんのことを学びます。 –

+0

丸められた値ではなく切り捨てられた値であることにも注意してください。 '2 ** - 33'を追加すると0x6a09e668に丸められます。 –

関連する問題