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.
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:
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:
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
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
math.inf
berguna 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 diketahuimath.inf
tanpa perlu menggunakan case khususNone
atau menganggap batas atas9999999
. Demikian pula, Anda dapat menggunakan-math.inf
sebagai nilai awal untuk masalah maksimalisasi.Jawaban:
Dengan Python, Anda bisa melakukan:
Di Python 3.5, Anda dapat melakukan:
Lalu:
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:akan kembali benar.
sumber
Ellipsis
, yang membandingkan lebih besar dari segalanya, termasuk tak terhingga.float("inf") < Ellipsis
mengembalikan Truemath.inf < ...
ataufloat('inf') > Ellipsis
melemparTypeError: unorderable types: float() < ellipsis()
, setidaknya untuk saya.Karena Python 3.5 Anda dapat menggunakan
math.inf
:sumber
Sepertinya tidak ada yang menyebutkan tentang infinity negatif secara eksplisit, jadi saya pikir saya harus menambahkannya.
Untuk infinity positif (hanya demi kelengkapan):
Untuk infinity negatif:
sumber
Saya tidak tahu persis apa yang Anda lakukan, tetapi
float("inf")
memberi Anda float Infinity, yang lebih besar dari angka lainnya.sumber
Ada tak terhingga di perpustakaan NumPy:
from numpy import inf
. Untuk mendapatkan infinity negatif seseorang cukup menulis-inf
.sumber
Cara lain yang kurang nyaman adalah dengan menggunakan
Decimal
kelas:sumber
Decimal('Infinity') == float('inf')
pengembalianTrue
, jadi hampir sama.float('inf') is float('inf')
kembaliFalse
jugafloat('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 menunjukfloat('int') == float('int')
berpegangTrue
. 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/…Di python2.x ada hack kotor yang melayani tujuan ini (JANGAN PERNAH menggunakannya kecuali benar-benar diperlukan):
Dengan demikian, cek
i < ''
berlakuTrue
untuk bilangan bulat apa puni
.Sudah cukup ditinggalkan di python3. Sekarang perbandingan seperti itu berakhir dengan
sumber
MIN_INFINITY = None; INFINITY = "inf"; MIN_INFINITY < x < INFINITY
Juga jika Anda menggunakan SymPy yang dapat Anda gunakan
sympy.oo
dll.
sumber