2

Pythonのfrexp関数とldexp関数は、floatを仮数と指数に分割します。このプロセスが実際のfloat構造を公開するのか、それともPythonが高価な対数呼び出しを行う必要があるのか​​を誰かが知っていますか?

4

3 に答える 3

5

Python 2.6 の math.frexp は、基礎となる C ライブラリ frexp を直接呼び出すだけです。C ライブラリは、利用可能かどうかを計算する代わりに、float 表現の部分を直接使用するだけであると想定する必要があります (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

frexpそのため、logとの間で Python で検出できる違いはあまりありません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:

ここには組み込まれていません。それはパイソンにあります。

于 2009-12-03T00:31:38.403 に答える