Redhat 6.3 上の Python 2.6
32 ビット浮動小数点値を 2 つのメモリ レジスタに保存し、最上位ワードと最下位ワードに分割するデバイスがあります。これをフロートに変換する必要があります。SO で見つかった次のコードを使用していますが、他の場所で見たコードに似ています
#!/usr/bin/env python
import sys
from ctypes import *
first = sys.argv[1]
second = sys.argv[2]
reading_1 = str(hex(int(first)).lstrip("0x"))
reading_2 = str(hex(int(second)).lstrip("0x"))
sample = reading_1 + reading_2
def convert(s):
i = int(s, 16) # convert from hex to a Python int
cp = pointer(c_int(i)) # make this into a c integer
fp = cast(cp, POINTER(c_float)) # cast the int pointer to a float pointer
return fp.contents.value # dereference the pointer, get the float
print convert(sample)
レジスタ値の例は次のとおりです。
レジスター 1;16282 レジスター 2;60597
これにより、結果のフロートが生成されます
1.21034872532
完全に複雑な数値ですが、メモリ値が次のようになる場合があります。
レジスター 1;16282 レジスター 2;1147
この関数を使用すると、float になります。
1.46726675314e-36
これは驚くほど小さな数であり、正しいように見える数ではありません。このデバイスは、1.2、1.3 の範囲で読み取り値を生成する必要があります。
私が解決しようとしているのは、デバイスが偽の値をスローしているかどうか、または取得している値は正しいが、使用している関数がそれらを適切に変換できないかどうかです。
また、numpy やその性質のものなど、これを行うためのより良い方法はありますか? 私は手を上げて、オンラインの例からこのコードをコピーしたばかりで、それがどのように機能するかをほとんど理解していないと言います。
ありがとうございました。