Bagaimana saya bisa mewakili angka tak terbatas dengan Python?

560

Bagaimana saya bisa mewakili angka tak terbatas dengan python? Tidak peduli nomor mana yang Anda masukkan dalam program, tidak ada angka yang harus lebih besar dari representasi infinity ini.

ssierral
sumber
29
math.infberguna sebagai nilai awal dalam masalah optimisasi, karena ia bekerja dengan benar dengan min, mis. min(5, math.inf) == 5. Misalnya, dalam algoritme jalur terpendek, Anda dapat mengatur jarak yang tidak diketahui math.inftanpa perlu menggunakan case khusus Noneatau menganggap batas atas 9999999. Demikian pula, Anda dapat menggunakan -math.infsebagai nilai awal untuk masalah maksimalisasi.
Kolonel Panic
Dalam kebanyakan kasus, alternatif untuk menggunakan math.inf dalam masalah optimisasi adalah mulai dengan nilai pertama.
Tobias Bergkvist

Jawaban:

708

Dengan Python, Anda bisa melakukan:

test = float("inf")

Di Python 3.5, Anda dapat melakukan:

import math
test = math.inf

Lalu:

test > 1
test > 10000
test > x

Akan selalu benar. Kecuali tentu saja, seperti yang ditunjukkan, x juga tak terbatas atau "nan" ("bukan angka").

Selain itu (Python 2.x ONLY), dibandingkan dengan Ellipsis, float(inf)lebih rendah, misalnya:

float('inf') < Ellipsis

akan kembali benar.

WilHall
sumber
15
Dan jika x juga inf itu tidak akan benar.
Maxim Egorushkin
5
Perhatikan bahwa infinity didefinisikan dalam norma IEEE 754-1985 ( en.wikipedia.org/wiki/IEEE_754-1985 ), yang diandalkan oleh bahasa modern mana pun. Poin lain adalah bahwa, menurut norma ini, infinity harus (jelas) menjadi angka floating-point. Ini mungkin menjelaskan mengapa Python memilih sintaks akward ini.
quickbug
3
Itu juga tidak akan benar jika x adalah bawaan Ellipsis, yang membandingkan lebih besar dari segalanya, termasuk tak terhingga. float("inf") < Ellipsismengembalikan True
Singletoned
2
Tidak yakin tentang yang terakhir, math.inf < ...atau float('inf') > Ellipsismelempar TypeError: unorderable types: float() < ellipsis(), setidaknya untuk saya.
Peter Goldsborough
2
Saya di 3.5. Mungkin hal 2.x / 3.x.
Peter Goldsborough
80

Karena Python 3.5 Anda dapat menggunakan math.inf:

>>> import math
>>> math.inf
inf
sayap kanan
sumber
47

Sepertinya tidak ada yang menyebutkan tentang infinity negatif secara eksplisit, jadi saya pikir saya harus menambahkannya.

Untuk infinity positif (hanya demi kelengkapan):

math.inf

Untuk infinity negatif:

-math.inf
Sнаđошƒаӽ
sumber
30

Saya tidak tahu persis apa yang Anda lakukan, tetapi float("inf")memberi Anda float Infinity, yang lebih besar dari angka lainnya.

Ned Batchelder
sumber
27

Ada tak terhingga di perpustakaan NumPy: from numpy import inf. Untuk mendapatkan infinity negatif seseorang cukup menulis -inf.

Lenar Hoyt
sumber
24

Cara lain yang kurang nyaman adalah dengan menggunakan Decimalkelas:

from decimal import Decimal
pos_inf = Decimal('Infinity')
neg_inf = Decimal('-Infinity')
Denis Malinovsky
sumber
21
kenapa tidak Anda tambahkan mengapa itu kurang nyaman dan mengapa ada orang yang menggunakannya ?
Niccolò
4
Mari kita lihat: Decimal('Infinity') == float('inf')pengembalian True, jadi hampir sama.
Denis Malinovsky
8
@afzal_SH float('inf') is float('inf')kembali Falsejuga
nemesisdesign
4
infinity berbeda bahkan dari dirinya sendiri, jadi komentar Anda tidak masuk akal bagi saya, IMHO
nemesisdesign
5
float('inf') is float('inf')-> False, hanya menyatakan bahwa mereka adalah objek yang berbeda dengan kasus yang berbeda, tetapi tidak bahwa isi internal yang berbeda - sebenarnya sebagai @nemesisdesign menunjuk float('int') == float('int')berpegang True. Ini adalah masalah yang sama seperti membandingkan objek yang bisa berubah seperti [1,2,3] adalah [1,2,3] dan [1,2,3] == [1,2,3], yang, dalam urutan, False dan Benar .. Info lebih lanjut lihat: stackoverflow.com/questions/2988017/…
Manoel Vilela
13

Di python2.x ada hack kotor yang melayani tujuan ini (JANGAN PERNAH menggunakannya kecuali benar-benar diperlukan):

None < any integer < any string

Dengan demikian, cek i < ''berlaku Trueuntuk bilangan bulat apa pun i.

Sudah cukup ditinggalkan di python3. Sekarang perbandingan seperti itu berakhir dengan

TypeError: unorderable types: str() < int()
Antony Hatchkins
sumber
5
Jika Anda benar-benar harus menggunakan ini, setidaknya bungkus dengan beberapa nama yang dapat dibaca seperti:MIN_INFINITY = None; INFINITY = "inf"; MIN_INFINITY < x < INFINITY
Ali Rasim Kocal
5
Tetapi Anda tidak harus menggunakan ini.
Joost
3

Juga jika Anda menggunakan SymPy yang dapat Anda gunakan sympy.oo

>>> from sympy import oo
>>> oo + 1
oo
>>> oo - oo
nan

dll.

Victor VosMottor berterima kasih pada Monica
sumber