Làm thế nào tôi có thể đại diện cho một số lượng vô hạn trong Python?


559

Làm thế nào tôi có thể đại diện cho một số lượng vô hạn trong python? Cho dù bạn nhập số nào trong chương trình, không có số nào lớn hơn số đại diện vô cực này.


29
math.inflà hữu ích như một giá trị ban đầu trong các vấn đề tối ưu hóa, bởi vì nó hoạt động chính xác với min, ví dụ. min(5, math.inf) == 5. Ví dụ: trong các thuật toán đường dẫn ngắn nhất, bạn có thể đặt khoảng cách không xác định thành math.infmà không cần trường hợp đặc biệt Nonehoặc giả sử giới hạn trên 9999999. Tương tự, bạn có thể sử dụng -math.inflàm giá trị khởi đầu cho các vấn đề tối đa hóa.
Đại tá hoảng loạn

Trong hầu hết các trường hợp, một cách khác để sử dụng math.inf trong các vấn đề tối ưu hóa là bắt đầu với giá trị đầu tiên.
Tobias Bergkvist

Câu trả lời:


707

Trong Python, bạn có thể làm:

test = float("inf")

Trong Python 3.5, bạn có thể làm:

import math
test = math.inf

Và sau đó:

test > 1
test > 10000
test > x

Sẽ luôn luôn đúng. Tất nhiên, trừ khi, như đã chỉ ra, x cũng là vô cùng hoặc "nan" ("không phải là số").

Ngoài ra (CHỈ Python 2.x), so với Ellipsis, float(inf)là ít hơn, ví dụ:

float('inf') < Ellipsis

sẽ trở lại đúng sự thật


15
Và nếu x cũng là inf thì điều đó sẽ không đúng.
Maxim Egorushkin

5
Lưu ý rằng vô cực được xác định trong định mức IEEE 754-1985 ( en.wikipedia.org/wiki/IEEE_754-1985 ), mà bất kỳ ngôn ngữ hiện đại nào cũng sẽ dựa vào. Một điểm khác là, theo định mức này, vô hạn phải (rõ ràng) phải là một số có dấu phẩy động. Điều này có thể giải thích tại sao Python đã chọn cú pháp akward này.
quickbird

3
Điều này cũng không đúng nếu x là tích hợp Ellipsis, so sánh lớn hơn mọi thứ, kể cả vô cực. float("inf") < Ellipsistrả về True
Singletoned

2
Không chắc chắn về cái cuối cùng, math.inf < ...hoặc float('inf') > Ellipsisném a TypeError: unorderable types: float() < ellipsis(), ít nhất là đối với tôi.
Peter Goldsborough

2
Tôi đang trên 3.5. Có lẽ là một điều 2.x / 3.x.
Peter Goldsborough

80

Vì Python 3.5, bạn có thể sử dụng math.inf:

>>> import math
>>> math.inf
inf

47

Không ai có vẻ đã đề cập về vô cực tiêu cực một cách rõ ràng, vì vậy tôi nghĩ rằng tôi nên thêm nó.

Đối với vô cực tích cực (chỉ vì lợi ích của sự hoàn chỉnh):

math.inf

Đối với vô cực tiêu cực:

-math.inf

30

Tôi không biết chính xác những gì bạn đang làm, nhưng float("inf")mang lại cho bạn một Infinity vô cùng, lớn hơn bất kỳ số nào khác.


27

Có một vô số trong thư viện NumPy : from numpy import inf. Để có được vô cực tiêu cực người ta có thể chỉ cần viết -inf.


24

Một cách khác, ít thuận tiện hơn, đó là sử dụng Decimallớp:

from decimal import Decimal
pos_inf = Decimal('Infinity')
neg_inf = Decimal('-Infinity')

21
Tại sao bạn không thêm lý do tại sao nó không thuận tiện và tại sao mọi người nên sử dụng nó ?
Niccolò

4
Hãy xem: Decimal('Infinity') == float('inf')trả về True, vì vậy nó khá giống nhau.
Denis Malinovsky

8
@afzal_SH cũng float('inf') is float('inf')trở lạiFalse
nemesisdesign

4
vô cùng khác với chính nó, vì vậy bình luận của bạn không có ý nghĩa gì với tôi, IMHO
nemesisdesign

5
float('inf') is float('inf')-> False, chỉ cho rằng họ là những đối tượng khác nhau với các trường hợp khác nhau, nhưng không phải là nội dung bên trong là khác nhau - thực sự như @nemesisdesign nhọn float('int') == float('int')giữ để True. Đây là vấn đề tương tự như so sánh các đối tượng có thể thay đổi như [1,2,3] là [1,2,3] và [1,2,3] == [1,2,3], theo thứ tự là Sai và Đúng .. Thông tin thêm xem: stackoverflow.com/questions/2988017/ từ
Manoel Vilela

13

Trong python2.x có một bản hack bẩn phục vụ mục đích này (KHÔNG BAO GIỜ sử dụng nó trừ khi thực sự cần thiết):

None < any integer < any string

Do đó, kiểm tra i < ''giữ Truecho bất kỳ số nguyên i.

Nó đã được phản đối hợp lý trong python3. Bây giờ so sánh như vậy kết thúc với

TypeError: unorderable types: str() < int()

5
Nếu bạn thực sự có yo hãy sử dụng cái này, ít nhất hãy bọc nó trong một số tên dễ đọc như:MIN_INFINITY = None; INFINITY = "inf"; MIN_INFINITY < x < INFINITY
Ali Rasim Kocal

5
Nhưng bạn không phải sử dụng cái này.
Joost

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.