gpt4 book ai didi

Python:为什么数学模块中的函数接受 Decimal 对象作为参数?

转载 作者:太空狗 更新时间:2023-10-29 21:01:24 25 4
gpt4 key购买 nike

奇怪的是,Python 的数学模块中的每个函数似乎都适用于 Decimal 对象。例如:frexp、exp、cos。

当我键入 print(math.frexp(decimal.Decimal('2341.12412'))) 时,Python 打印出正确答案,即 (0.57156... , 12),并且不会抛出任何异常。

我假设数学模块将用低级 C 编写,尽可能依赖硬件数学运算来提高效率。那么...为什么它适用于 Decimal 对象?

他们是否对数学函数进行了类型检查,并在参数为 Decimal 时切换到不同的实现?我没有看到文档中提到的任何内容。也可能是小数自动转换为 float ,但这也没有任何意义。

是的,我很困惑。

最佳答案

看看 math module.c 我明白了:

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);
}

查看代码,它实际上使用了float (PyFloat_AsDouble)

exp 也是一样,

static PyObject *
math_factorial(PyObject *self, PyObject *arg)
{
long x;
PyObject *result, *odd_part, *two_valuation;

if (PyFloat_Check(arg)) {
PyObject *lx;
double dx = PyFloat_AS_DOUBLE((PyFloatObject *)arg);
if (!(Py_IS_FINITE(dx) && dx == floor(dx))) {
PyErr_SetString(PyExc_ValueError,
"factorial() only accepts integral values");
return NULL;
}
lx = PyLong_FromDouble(dx);
if (lx == NULL)
return NULL;
x = PyLong_AsLong(lx);
Py_DECREF(lx);
.........................................................

关于Python:为什么数学模块中的函数接受 Decimal 对象作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15846510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com