python的float.\uuuueq\uuuuuuuuuuuuuuuuuuuuuuuuu是如何在语言中实现的?

2024-09-27 07:32:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道比较两个浮点数是否相等的最佳方法通常是使用math.isclose(float_a, float_b)。但是我很想知道如果你只是简单地做float_a == float_b,python是如何做到的

我想它是用C实现的,但它背后的逻辑是什么


Tags: 方法math逻辑float浮点数isclose
1条回答
网友
1楼 · 发布于 2024-09-27 07:32:14

这是source code for float object comparisons

基本上。它看起来非常复杂,但这种复杂性主要表现在处理floatint相比较的情况(Python中的int对象大小是任意的,它们不是用Python对象包装的C-int)

但是对于floatfloat的简单情况:

static PyObject*
float_richcompare(PyObject *v, PyObject *w, int op)
{
    double i, j;
    int r = 0;

    assert(PyFloat_Check(v));
    i = PyFloat_AS_DOUBLE(v);

    /* Switch on the type of w.  Set i and j to doubles to be compared,
     * and op to the richcomp to use.
     */
    if (PyFloat_Check(w))
        j = PyFloat_AS_DOUBLE(w);

因此它只是从float对象创建两个Cdouble,然后(跳过所有int处理内容):

 Compare:
    switch (op) {
    case Py_EQ:
        r = i == j;
        break;
    case Py_NE:
        r = i != j;
        break;
    case Py_LE:
        r = i <= j;
        break;
    case Py_GE:
        r = i >= j;
        break;
    case Py_LT:
        r = i < j;
        break;
    case Py_GT:
        r = i > j;
        break;
    }
    return PyBool_FromLong(r);

它最终只是做了一个C级的==比较。所以它不会在引擎盖下面而不是math.isclose(float_a, float_b).

相关问题 更多 >

    热门问题