これは明らかdocumented in the format tableある:
'f'
と
'd'
変換コードについて
、パックされた表現にかかわらず、浮動小数点形式の、('f'
用)IEEE 754 binary32又はbinary64('d'
ための)フォーマットを使用しますプラットフォームによって使用されます。
この形式を理解するには、IEEE floating point standardを参照してください。 f
コードを使用したので、binary32, or single precision formatを探してください。
このフォーマットは32ビットに分割からなる:
- 符号ビット:1ビット
- 指数幅:8ビット
- 仮数精度:24ビット(23明示的に格納されている)
バイナリデータをビットで見ると(リトルエンディアンとして扱われるので、これを逆にしてWikipediaのビッグエンディアンの順序に合わせます):
>>> ('{:08b}' * 4).format(*b'\x00\x00\xb8A'[::-1])
'01000001101110000000000000000000'
符号が0、指数幅が131(2の補数で127が4になる)、仮数の精度または仮数が1.4375(1 + 1/4 + 1/8 + 1/16、各バイナリ分数は有効ビットです)。全整数とバイナリで小数点以下の値を表現する、
>>> 1 * 2 ** 4 * 1.4375 (sign, positive, times 2 to the power exponent, times fractions)
23.0
は他の方法に行く;一緒
>>> ('{:08b}' * 4).format(*b'\x00\x00\xb8A'[::-1])[:1] # sign
'0'
>>> ('{:08b}' * 4).format(*b'\x00\x00\xb8A'[::-1])[1:9] # exponent, signed
'10000011'
>>> int(('{:08b}' * 4).format(*b'\x00\x00\xb8A'[::-1])[1:9], 2) - 127 # exponent, signed
4
>>> ('{:08b}' * 4).format(*b'\x00\x00\xb8A'[::-1])[9:] # mantissa
'01110000000000000000000'
>>> # That's the 1/4 bit plus the 1/8th bit plus the 1/16th bits all enabled.
...
>>> 1 + 1/4 + 1/8 + 1/16
1.4375
これらは、実際の浮動小数点値を形成しますおおよそバイナリ分数はすべての可能な実数を表すことができないので、非整数部分を持つ必要があります。 23。それがここに簡単ですが、我々は唯一のバイナリに整数成分を変換する必要がありますので0、何の非整数成分を持っていない:
>>> format(23, 'b')
'10111'
ので、実数のバイナリ表現が10111.0
です。小数点を上下に移動して1
と小数点を取得します。ここで小数点を4点上に移動して1.0111
にする必要があります。これにより、指数(4)、および有意な(0111と未使用の分数のための19のゼロ)が得られます。値が正であるので、あなたは、符号付きの値として指数が(127 == 131を追加バイナリ== 10000011
に131をコード)、および追加0
などの記号をコード重要:
0 10000011 01110000000000000000000
はにそれをチョッピング8ビット(4バイト)の4つのグループはあなたに0x41 0xB8 0x00 0x00
を与えます。バイトのためのPythonのrepr()
出力はあなたのバイト、可能な場合のための印刷可能なASCII文字を与え、0x41
はASCIIテーブル内の文字A
次のとおりです。
>>> bytes([0b01000001, 0b10111000, 0b00000000, 0b00000000])
b'A\xb8\x00\x00'
リトルエンディアン表現のため、これらのバイトを逆
:
>>> bytes([0b01000001, 0b10111000, 0b00000000, 0b00000000])[::-1]
b'\x00\x00\xb8A'
IEEE binary32形式がthis online converterでどのように動作するかを視覚化することができます。
'a2b'コマンドは何をしますか?私のDebian、CentOS、またはOS Xシステムには、そのコマンドがありません。 –
@Martijnそうです、私はそれを見落としました。それは「地震学Unix」の一部です。 asciiは行ごとに浮動小数点数を読み込み、2進数に変換します。リトルエンディアンは、この場合、私は信じています。 – Michael
そうです、[this tool](http://www.cwp.mines.edu/sututor/node33.html)ですか? –