2010-11-06 32 views
7

Tôi có vấn đề nàypow tiêu cực trong python

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

bất cứ đề nghị?

+4

trích dẫn hướng dẫn: "Nếu cả x và y là hữu hạn, x là âm và y không phải là số nguyên thì pow (x, y) không xác định và tăng giá trị ValueError." – zellus

Trả lời

25

(-1.07) 1.3 sẽ không phải là số thực, do đó lỗi miền Math.

Nếu bạn cần số phức, b phải được viết lại thành e b ln a, ví dụ:

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

Nếu bạn chỉ muốn trả lại NaN, hãy bắt ngoại lệ đó.

>>> 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 

BTW, bằng Python thường được xây dựng trong a ** b được sử dụng để nâng cao sức mạnh, không 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) 
2

Tôi đang sử dụng python 2.5.4 và tôi có được điều này:

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

phiên bản python gì bạn đang sử dụng?

+2

Python ≥2.6 đã tạo ngoại lệ. – kennytm

9

Không sử dụng pow và làm phức tạp số mũ (thêm 0j vào nó). Dưới đây là một ví dụ:

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

Không cần cho các chức năng toán học :)

0

Từ tựa đề của bài viết này chỉ ra rằng điện là tiêu cực, là nó có thể rằng bạn thực sự muốn 1.3 - 1.07 thay vì -1.07 1.3?

1

Các quyền hạn không phức tạp của các số phức (và âm) liên quan đến sự tinh tế quan trọng. Hàm mũ được tiêm trên dòng thực; ví dụ: exp (a) = exp (b) ngụ ý a = b. Điều này KHÔNG ở trên mặt phẳng phức tạp. Từ exp ​​(2 * pi * i) = 1, hàm mũ là 2 * pi * i-periodic.

Điều này dẫn đến sự cố: Chúng tôi sử dụng chi nhánh nào của chức năng đăng nhập? Câu hỏi đặt ra là một trong những câu hỏi trung tâm của phân tích phức tạp.

Python đang phản hồi thông minh với tình huống này. Trừ khi bạn sử dụng một cách rõ ràng phương thức khởi tạo số phức tạp của nó, bạn sẽ được buôn bán trong thực tế. Vì sức mạnh phân số của các từ âm không bao giờ thực, Python là một cách thích hợp để ném một ngoại lệ.

Các vấn đề liên quan