这是我的C ++代码:
int r; // result of log_2(v) goes here
union { unsigned int u[2]; double d; } t; // temp
t.u[__FLOAT_WORD_ORDER==LITTLE_ENDIAN] = 0x43300000;
t.u[__FLOAT_WORD_ORDER!=LITTLE_ENDIAN] = v;
t.d -= 4503599627370496.0;
r = (t.u[__FLOAT_WORD_ORDER==LITTLE_ENDIAN] >> 20) - 0x3FF;
return r;
我试图在python中完全复制这段代码,到目前为止我的代码是:
class s(Structure):
_fields_ = [("u", c_ulonglong), ("d", c_double)]
t = s()
t.u = pack('<Q', c_ulonglong(int("0x43300000", 16))) # Error cannot convert argument to integer
t.u = pack('>Q', c_ulonglong(v))
t.d -= 4503599627370496.0
r = (t.u >> 20) - 0x3FF
我在将“十六进制数”打包成“u”时遇到错误,就像在c ++代码中提到的那样。我想解决这个错误并在python中成功完成这段代码。
答案 0 :(得分:0)
有一个完整的例子(这里有很多未定义的值)很有帮助,但这更接近于意图。请注意使用Union
和c_int * 2
:
class s(Union):
_fields_ = [("u", c_int * 2),
("d", c_double)]
t = s()
t.u[__FLOAT_WORD_ORDER==LITTLE_ENDIAN] = 0x43300000
t.u[__FLOAT_WORD_ORDER!=LITTLE_ENDIAN] = v # whatever that is
t.d -= 4503599627370496.0
r = (t.u[__FLOAT_WORD_ORDER==LITTLE_ENDIAN] >> 20) - 0x3FF
return r