[英]python 2.5: how to convert float to hex?
我想使用python 2.4 / 2.5将十六进制转换为浮点数( time.time()
的输出time.time()
。
我发现了很多将十六进制转换为float的示例,但是找不到任何可以执行python> = 2.6的float.hex()
的事情。
不能在2.6版之前的Python中移植; 它需要sys.float_info中的信息,这是Python 2.6中的新增功能。
如果要非便携式地执行此操作,即针对您的特定平台,则需要查看用于生成2.4 / 5 Python的C编译器的float.h
文件,或者查看由以下代码返回的sys.float_info您平台上的2.6或2.7实现(并相信它适用于您的2.4 / 5 Python)。 然后,您需要查看Python源代码(Objects / floatobject.c)中的float_hex
函数,并将其转换为Python并进行测试(也许是针对2.6 / 7 Python)。
这似乎是一项艰巨的工作,是为了什么? 你的目标是什么? 您想做什么是repr(your_float)
无法实现的?
编辑 :需要一个唯一的标识符
请注意,time.time()不太精确:
“”“ time.time()以UTC时间返回以纪元为单位的时间(以秒为单位)表示的时间。请注意,即使始终将时间返回为浮点数,也不是所有系统都可以提供精度更高的时间小于1秒。虽然此函数通常返回非递减值,但如果两次调用之间的系统时钟已被调回,则它可以返回比上一个调用更低的值。
允许高达十亿分之一秒的分辨率:
>>> hex(int(time.time() * 1000000000))
'0x11ef11c41cf98b00L'
>>>
这样够好吗?
这是代码的C版本,我现在没有时间移植它,但是也许其他人可以。
float_hex(PyObject *v)
{
double x, m;
int e, shift, i, si, esign;
/* Space for 1+(TOHEX_NBITS-1)/4 digits, a decimal point, and the
trailing NUL byte. */
char s[(TOHEX_NBITS-1)/4+3];
CONVERT_TO_DOUBLE(v, x);
if (Py_IS_NAN(x) || Py_IS_INFINITY(x))
return float_str((PyFloatObject *)v);
if (x == 0.0) {
if (copysign(1.0, x) == -1.0)
return PyString_FromString("-0x0.0p+0");
else
return PyString_FromString("0x0.0p+0");
}
m = frexp(fabs(x), &e);
shift = 1 - MAX(DBL_MIN_EXP - e, 0);
m = ldexp(m, shift);
e -= shift;
si = 0;
s[si] = char_from_hex((int)m);
si++;
m -= (int)m;
s[si] = '.';
si++;
for (i=0; i < (TOHEX_NBITS-1)/4; i++) {
m *= 16.0;
s[si] = char_from_hex((int)m);
si++;
m -= (int)m;
}
s[si] = '\0';
if (e < 0) {
esign = (int)'-';
e = -e;
}
else
esign = (int)'+';
if (x < 0.0)
return PyString_FromFormat("-0x%sp%c%d", s, esign, e);
else
return PyString_FromFormat("0x%sp%c%d", s, esign, e);
}
当然,这可以通过便携式方式完成,这只是数学。 这是这样的(包括测试证明它是有效的)。
from __future__ import division
MAXHEXADECIMALS = 10
def float2hex(f):
w = f // 1
d = f % 1
# Do the whole:
if w == 0:
result = '0'
else:
result = ''
while w:
w, r = divmod(w, 16)
r = int(r)
if r > 9:
r = chr(r+55)
else:
r = str(r)
result = r + result
# And now the part:
if d == 0:
return result
result += '.'
count = 0
while d:
d = d * 16
w, d = divmod(d, 1)
w = int(w)
if w > 9:
w = chr(w+55)
else:
w = str(w)
result += w
count += 1
if count > MAXHEXADECIMALS:
break
return result
import unittest
class Float2HexTest(unittest.TestCase):
def test_ints(self):
assert float2hex(0x25) == '25'
assert float2hex(0xFE) == 'FE'
assert float2hex(0x00) == '0'
assert float2hex(0x01) == '1'
assert float2hex(0x14E7F400A5) == '14E7F400A5'
def test_floats(self):
assert float2hex(1/2) == '0.8'
assert float2hex(1/13) == '0.13B13B13B13'
assert float2hex(1034.03125) == '40A.08'
suite = unittest.makeSuite(Float2HexTest)
runner = unittest.TextTestRunner()
runner.run(suite)
是的,那毫无意义。 :-)当然,在这种情况下,正确的答案是不将浮点数转换为十六进制,而是使用时间的INTEGER表示并将其转换为十六进制字符串。 但是仍然可以做到。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.