2013-04-06 10 views
8

विचित्र रूप से, पाइथन के गणित मॉड्यूल से प्रत्येक कार्य दशमलव वस्तुओं के साथ ठीक काम करता प्रतीत होता है। उदाहरण के लिए: frexp, exp, cos।पायथन: गणित मॉड्यूल में फ़ंक्शंस दशमलव वस्तुओं को तर्क के रूप में क्यों स्वीकार करते हैं?

जब मैं print(math.frexp(decimal.Decimal('2341.12412'))) टाइप करता हूं, तो पायथन सही उत्तर प्रिंट करता है, जो (0.57156... , 12) है, और कोई अपवाद नहीं फेंकता है।

मुझे लगता है कि गणित मॉड्यूल निम्न स्तर के सी में लिखा जाएगा, जो दक्षता के लिए हार्डवेयर गणित संचालन पर जितना संभव हो उतना निर्भर करता है। तो ... यह दशमलव वस्तुओं के लिए क्यों काम करेगा?

क्या उन्होंने गणित कार्यों में एक प्रकार की जांच डाली, और यदि तर्क एक दशमलव है तो एक अलग कार्यान्वयन पर स्विच करें? मैंने दस्तावेज़ों में उल्लिखित कुछ भी नहीं देखा। यह भी हो सकता है कि दशमलव को स्वचालित रूप से एक फ्लोट में परिवर्तित किया जा रहा है, लेकिन इससे कोई अर्थ नहीं आता है।

हाँ, मैं उलझन में हूं।

+2

Presuambly, वे तैरने में परिवर्तित हो रहे हैं। – Antimony

+0

'दशमलव' ऑब्जेक्ट के कार्यों को बढ़ाएं और देखें कि जब आप इसे पास करते हैं तो उस पर क्या कहा जा रहा है। –

+0

मैंने अभी अभी कोशिश की है। मैंने दशमलव वर्ग को बढ़ाया और एक संदेश मुद्रित करने के लिए \ _ \ _ add__ और \ _ \ _ multiply__ फ़ंक्शंस को ओवरराइड किया और बराबर दशमलव कार्य को कॉल किया। अब तक, ऐसा लगता है कि गणित कार्यों में से कोई भी \ _ \ _ add__ या \ _ \ _ multiply__ को कॉल नहीं कर रहा है, क्योंकि जब मैं उन्हें कॉल करता हूं तो संदेशों को प्रिंट नहीं किया जाता है (एक्सपी, 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)

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

धन्यवाद! मैं ईमानदारी से हैरान हूं कि वे तर्क को एक फ्लोट में परिवर्तित कर देंगे। मैंने सोचा होगा कि प्रोग्रामर को स्वयं रूपांतरण करने देना बेहतर होगा ... लेकिन मुझे क्या पता चलेगा? –

संबंधित मुद्दे