سؤال

لدي هذه المشكلة

>>> import math
>>> math.pow(-1.07,1.3)  
Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
ValueError: math domain error

أي اقتراح ؟

هل كانت مفيدة؟

المحلول

(-1.07)1.3 لن يكون رقمًا حقيقيًا ، وبالتالي خطأ مجال الرياضيات.

إذا كنت بحاجة إلى رقم معقد ، أب يجب إعادة كتابة إلى هـب ln a, ، على سبيل المثال

>>> import cmath
>>> cmath.exp(1.3 * cmath.log(-1.07))
(-0.6418264288034731-0.8833982926856789j)

إذا كنت ترغب فقط في إعادة NAN ، فلقع هذا الاستثناء.

>>> import math
>>> def pow_with_nan(x, y):
...   try:
...     return math.pow(x, y)
...   except ValueError:
...     return float('nan')
...
>>> pow_with_nan(1.3, -1.07)   # 1.3 ** -1.07
0.755232399659047
>>> pow_with_nan(-1.07, 1.3)   # (-1.07) ** 1.3
nan

راجع للشغل ، في بيثون عادة ما يكون مدمج a ** b يستخدم لرفع الطاقة ، وليس math.pow(a, b).

>>> 1.3 ** -1.07
0.755232399659047
>>> (-1.07) ** 1.3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: negative number cannot be raised to a fractional power
>>> (-1.07+0j) ** 1.3
(-0.6418264288034731-0.8833982926856789j)

نصائح أخرى

لا تستخدم POW ، وجعل مجمع الأسعار (أضف 0j لذلك). هنا مثال:

In [15]: (-1.07)**(1.3+0j)
Out[15]: (-0.64182642880347307-0.88339829268567893j)

لا حاجة لوظائف الرياضيات :)

أنا أستخدم Python 2.5.4 وأحصل على هذا:

>>> import math
>>> math.pow(-1.07,1.3)  
nan

ما هو إصدار Python الذي تستخدمه؟

تتضمن قوى Noneteger للأرقام المعقدة (والسلبية) دقة مهمة. الوظيفة الأسية هي حقن على الخط الحقيقي ؛ أي exp (a) = exp (b) يعني a = b. هذا ليس كذلك على الطائرة المعقدة. منذ exp (2*pi*i) = 1 ، فإن الوظيفة الأسية هي 2*pi*i-periodic.

هذا يؤدي إلى المشكلة: ما هو فرع وظيفة السجل التي نستخدمها؟ السؤال المذكور هو أحد الأسئلة المركزية للتحليل المعقد.

بيثون يستجيب بذكاء لهذا الموقف. ما لم تستخدم صراحة مُنشئ الأرقام المعقدة الخاصة به ، فستكون تهربًا في الواقع. نظرًا لأن القوى الكسرية للسلبيات ليست حقيقية أبدًا ، فإن بيثون يلقي بشكل مناسب استثناء.

من عنوان هذا المنشور يشير إلى أن قوة هل هو سلبي ، هل من الممكن أنك تريد بالفعل 1.3-1.07 بدلا من -1.071.3?

صلاحيات القواعد السلبية هي أرقام معقدة. إليك مثال يشرح كيفية إصلاحه:

from numpy import *
t  = arange(-3, 3, 0.1)

for n in range(0,len(t)):
    T = t[n]
    x = (complex(-0.5,0))**T
    print(T, x)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top