2013-04-06 1 views
8

Bizzarely, 파이썬의 수학 모듈의 모든 함수는 Decimal 객체에서 잘 작동하는 것 같습니다. 예 : frexp, exp, cos.Python : 수학 모듈의 함수가 Decimal 객체를 인수로 사용하는 이유는 무엇입니까?

print(math.frexp(decimal.Decimal('2341.12412')))을 입력하면 파이썬은 정답 인 (0.57156... , 12)을 인쇄하고 예외를 throw하지 않습니다.

수학 모듈은 저수준 C로 작성되어 하드웨어 연산 작업에 가능한 한 많이 의존한다고 가정합니다. 그래서 ... 왜 Decimal 객체에서 작동합니까?

수학 함수에 형식 검사를했는지, 인수가 10 진수 일 경우 다른 구현으로 전환 했습니까? 나는 문서에서 언급 한 것과 같은 것을 보지 못했습니다. 또한 Decimal이 자동으로 float로 변환 될 수도 있지만 의미가 없습니다.

예, 혼란 스럽습니다.

+2

, exp에 대한 Presuambly, 그들은 부유물로 변환됩니다. – Antimony

+0

'Decimal' 객체의 함수를 확장하여 전달할 때 호출되는 객체를 확인하십시오. –

+0

이제 막 시도했습니다. Decimal 클래스를 확장하고 \ _ \ _ add__ 및 \ _ \ _ multiply__ 함수를 오버라이드하여 메시지를 인쇄하고 동등한 Decimal 함수를 호출했습니다. 지금까지는 수학 함수가 \ _ \ _ add__ 또는 \ _ \ _ multiply__를 호출하지 않는 것 같습니다. 메시지를 호출 할 때 (exp, frexp 등) 인쇄하지 않기 때문입니다. 아마도 소수점이 부동 소수점으로 변환 될 것입니다 ... –

답변

7

그럼 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)

다시 같은 일

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); 
......................................................... 
+0

감사! 솔직히 말해서 인수를 인수로 변환하는 것이 놀랍습니다. 나는 프로그래머가 스스로 변환을하도록하는 것이 더 좋을 것이라고 생각했을 것이다. 그러나 나는 무엇을 알고 있는가? –

관련 문제