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);
这是source code for float object comparisons
基本上。它看起来非常复杂,但这种复杂性主要表现在处理
float
与int
相比较的情况(Python中的int
对象大小是任意的,它们不是用Python对象包装的C-int)但是对于
float
和float
的简单情况:因此它只是从
float
对象创建两个Cdouble
,然后(跳过所有int处理内容):它最终只是做了一个C级的
==
比较。所以它不会在引擎盖下面而不是做math.isclose(float_a, float_b).
相关问题 更多 >
编程相关推荐