python frexp 和 ldexp 函数将浮点数拆分为尾数和指数。有谁知道这个过程是否暴露了实际的浮点结构,或者它是否需要 python 进行昂贵的对数调用?
问问题
1858 次
3 回答
5
Python 2.6 的 math.freexp 只是直接调用底层 C 库 frexp。我们必须假设 C 库直接使用浮点表示的部分而不是计算是否可用 (IEEE 754)。
static PyObject *
math_frexp(PyObject *self, PyObject *arg)
{
int i;
double x = PyFloat_AsDouble(arg);
if (x == -1.0 && PyErr_Occurred())
return NULL;
/* deal with special cases directly, to sidestep platform
differences */
if (Py_IS_NAN(x) || Py_IS_INFINITY(x) || !x) {
i = 0;
}
else {
PyFPE_START_PROTECT("in math_frexp", return 0);
x = frexp(x, &i);
PyFPE_END_PROTECT(x);
}
return Py_BuildValue("(di)", x, i);
}
PyDoc_STRVAR(math_frexp_doc,
"frexp(x)\n"
"\n"
"Return the mantissa and exponent of x, as pair (m, e).\n"
"m is a float and e is an int, such that x = m * 2.**e.\n"
"If x is 0, m and e are both 0. Else 0.5 <= abs(m) < 1.0.");
于 2009-12-02T18:25:20.730 回答
1
至于速度,这里有一个快速比较
$ python -m timeit -c 'from math import frexp' 'frexp(1.1)'
100000 loops, best of 3: 3.7 usec per loop
$ python -m timeit -c 'from math import log' 'log(1.1)'
100000 loops, best of 3: 3.7 usec per loop
$ python -m timeit -c 'from math import ldexp' 'ldexp(1.1,2)'
100000 loops, best of 3: 3.5 usec per loop
因此,在 python 中frexp
,在速度log
和ldexp
速度方面并没有太大的差异。不确定这是否会告诉您有关实施的任何信息!
于 2009-12-02T19:17:07.943 回答
1
这是一个您可以轻松回答的问题:
$ python
>>> import math
>>> help(math.frexp)
Help on built-in function frexp in module math:
注意内置的. 它在 C 中。
>>> import urllib
>>> help(urllib.urlopen)
Help on function urlopen in module urllib:
这里没有内置。它在 Python 中。
于 2009-12-03T00:31:38.403 回答