

PYTHON3です  
16進数「00000080be2c9d3f」とあるとします。これを倍精度浮動小数点に変換したいのですが  
簡単にできる関数やモジュールなどはありませんでしょうか。単精度浮動小数点についてもあれば教えて欲しいです。自身で2進数に変換してなんやかんやすると値があさっての方向に行ってしまいます。前ゼロが2進数に変換できていないものと思いますが・・・教えていただけないでしょうか。


CC BY-SA 4.0
2018-11-06T01:59:28.053
49996
2018-11-06T04:09:49.470
30329
question
python3
16進数の倍精度浮動小数点・単精度浮動小数点の変換について


まず、16進数「00000080be2c9d3f」ということですが、このテータをどこから取ってきたかによって答えが変わるということに注意してください。

どうしてかというと、サーバーやデスクトップPCで通常使われいるIntelのCPUは、バイトオーダがリトルエンディアンを採用しています。そのためメモリーやCPU上では、バイト毎に下位側から並びます。一方、人間が16進法を扱う場合は、バイト毎に上位側から並べる方が理解しやすいのでそちらを使います。それがビッグエンディアンです。例えば、人間が16進法で表現して`000000FF`の場合には、Intelのマシン上では`FF000000`という並びになっています。

したがって、ビッグエンディアンの場合は、16進数「00000080be2c9d3f」は指数部が0なので、非正規化数といって0にごく近い数になります。一方、リトルエンディアンの場合は、人間が理解しやすいビッグエンディアンにすると`3f9d2cbe80000000`となって、符号が正で、指数部が`01111111001`の浮動小数点数になります。

Pythpnでは、バイナリーとの変換をする場合には、struct モジュールを使います。

ビッグエンディアンの場合は、

[code]

    struct.unpack('>d', bytes.fromhex('00000080be2c9d3f'))[0]
    2.73191824563e-312
    
[/code]

リトルエンディアンの場合は、nativeでいいので

[code]

    struct.unpack('d', bytes.fromhex('00000080be2c9d3f'))[0]
    0.028490997850894928
    
[/code]

単精度浮動小数点の場合は、`d`を`f`に変更するだけです。

公式ドキュメント [struct](https://docs.python.org/ja/3.7/library/struct.html)


CC BY-SA 4.0
2018-11-06T04:09:49.470
50003
2018-11-06T04:09:49.470
15171
49996
answer