Nilai maksimum dan minimum untuk int

745

Saya mencari nilai minimum dan maksimum untuk integer dalam python. Misalnya, di Jawa, kita memiliki Integer.MIN_VALUEdan Integer.MAX_VALUE. Apakah ada yang seperti ini dengan python?

bdhar
sumber
14
Perhatikan bahwa pada Python 3 intjenisnya pada dasarnya sama dengan longjenis pada Python 2, sehingga gagasan maksimum atau minimum intmenghilang sepenuhnya. Ini pada dasarnya tidak relevan bahkan pada Python 2.
agf
8
@agf: ini bisa relevan dengan berbagai cara. Misalnya dalam algoritma apa pun yang perlu menyimpan nilai min yang ditemukan (seperti algoritma pengurutan). Nilai min dapat diinisialisasi di sys.maxint sehingga menjamin bahwa nilai pertama yang ditemukan diambil sebagai min
Basile Perrenoud
@Toaster, kecuali bahwa Anda dapat memiliki daftar di mana semua nilai lebih besar daripada sys.maxintkarena hanya maksimum untuk intjenis pada Python 2, yang Python akan diam-diam mempromosikan ke a long.
agf
30
Jika Anda perlu menggunakan "nilai yang sangat besar" dalam suatu algoritma, mis. Menemukan minimum atau maksimum koleksi generik, float('inf')atau float('-inf')bisa sangat membantu.
geoff
1
Kemungkinan duplikat rentang bilangan bulat Python
Waldir Leoncio

Jawaban:

853

Python 3

Dalam Python 3, pertanyaan ini tidak berlaku. intJenis polos tidak terikat.

Namun, Anda mungkin sebenarnya mencari informasi tentang ukuran kata juru bahasa saat ini , yang akan sama dengan ukuran kata mesin dalam banyak kasus. Informasi itu masih tersedia dalam Python 3 sys.maxsize, yang merupakan nilai maksimum yang diwakili oleh kata yang ditandatangani. Secara ekuivalen, itu adalah ukuran dari daftar terbesar atau urutan dalam memori .

Secara umum, nilai maksimum yang diwakili oleh kata yang tidak ditandatangani akan menjadi sys.maxsize * 2 + 1, dan jumlah bit dalam sebuah kata akan math.log2(sys.maxsize * 2 + 2). Lihat jawaban ini untuk informasi lebih lanjut.

Python 2

Dalam Python 2, nilai maksimum untuk intnilai polos tersedia sebagai sys.maxint:

>>> sys.maxint
9223372036854775807

Anda dapat menghitung nilai minimum dengan -sys.maxint - 1seperti yang ditunjukkan di sini .

Python beralih dari integer polos ke panjang setelah Anda melebihi nilai ini. Jadi sebagian besar waktu, Anda tidak perlu mengetahuinya.

pengirim
sumber
177
Angka ini mungkin tampak sewenang-wenang, tetapi tidak. 9223372036854775807 persis 2^63 - 1, jadi Anda punya int 64-bit. Secara umum, integer n-bit memiliki nilai mulai dari -2^(n-1)hingga 2^(n-1) - 1.
NullUserException
22
Perhatikan bahwa jika Anda menggunakan runtime Python 32-bit, sys.maxint akan kembali 2^31 - 1, meskipun Python akan melompat ke 64-bit secara mulus dengan longdatatype.
Scott Stafford
19
Gunakan sys.maxsizesebaliknya, seperti yang disarankan oleh @Akash Rana. Itu hadir juga dalam Python 2, sepertisys kata docs . Ini akan membuat kode lebih kompatibel dengan kedua versi Python.
Ioannis Filippidis
6
Anda dan saya memiliki interpretasi berbeda tentang garis itu dari dokumen. Penggantian dalam 2to3adalah heuristik cepat dan kotor yang bagus yang tidak akan merusak sebagian besar waktu - tetapi perbedaan antara kedua nilai ini penting. Praktik terbaik adalah menggunakan nilai yang Anda maksudkan sebenarnya. Jika Anda benar-benar membutuhkan sys.maxint Python 2, Anda tidak akan memerlukannya lagi di Python 3, dan itu harus benar-benar dihapus seluruhnya, tidak diubah menjadi sys.maxsize.
pengirim
3
minsize - Mengalikan dengan operator min Bitwise memberikan minsize ~ sys.maxsize
om471987
238

Jika Anda hanya membutuhkan angka yang lebih besar dari yang lainnya, Anda dapat menggunakannya

float('inf')

dengan cara yang sama, jumlah yang lebih kecil dari yang lainnya:

float('-inf')

Ini berfungsi di kedua python 2 dan 3.

Melle
sumber
9
Hanya sebuah catatan yang (tidak relevan, tapi tetap saja): float ('inf')> float ('inf') menghasilkan 'false'. Angka tak hingga harus lebih besar dari angka tak terbatas lainnya :-D ... mind snaps
Scre
11
@ Scre Apa lagi yang Anda harapkan? x > xbiasanya False, dan tak terbatas seharusnya tidak terkecuali. ( float('NaN), di sisi lain ...)
jamesdlin
6
Ini sebenarnya tidak berlaku untuk intcauze cannot convert infinite float to int... tetapi berfungsi untuk sebagian besar kasus
Leighton
5
Perhatikan itu int('inf')tidak berhasil.
Tom Hale
4
Ini bukan jawaban untuk pertanyaan OP
ghosh
225

The sys.maxintkonstan telah dihapus dari Python 3.0 dan seterusnya, bukan menggunakansys.maxsize .

Integer

  • PEP 237: Intinya, lama berganti nama menjadi int. Artinya, hanya ada satu tipe integral bawaan, bernama int; tetapi sebagian besar berperilaku seperti tipe lama yang lama.
  • PEP 238: Ekspresi seperti 1/2 mengembalikan float. Gunakan 1 // 2 untuk mendapatkan perilaku pemotongan. (Sintaks terakhir sudah ada selama bertahun-tahun, setidaknya sejak Python 2.2.)
  • Konstanta sys.maxint dihapus, karena tidak ada lagi batas nilai integer. Namun, sys.maxsize dapat digunakan sebagai bilangan bulat yang lebih besar daripada daftar praktis atau indeks string. Ini sesuai dengan ukuran integer "alami" implementasi dan biasanya sama dengan sys.maxint dalam rilis sebelumnya pada platform yang sama (dengan asumsi opsi build yang sama).
  • Repr () dari integer panjang tidak lagi menyertakan trailing L, jadi kode yang tanpa syarat akan menghapus karakter yang akan memotong digit terakhir. (Gunakan str () sebagai gantinya.)
  • Literal oktal tidak lagi berbentuk 0720; gunakan 0o720 sebagai gantinya.

Rujuk: https://docs.python.org/3/whatsnew/3.0.html#integers

Akash Rana
sumber
1
Benar. Memang, dari help(sys): maxsize - panjang kontainer terbesar yang didukung . Ini harus menjadi jawaban yang diterima.
Marco Sulla
77

Dalam Python integer akan secara otomatis beralih dari intrepresentasi ukuran tetap ke representasi lebar variabel longsetelah Anda melewati nilai sys.maxint, yang merupakan 2 31 - 1 atau 2 63 - 1 tergantung pada platform Anda. Perhatikan Lyang ditambahkan di sini:

>>> 9223372036854775807
9223372036854775807
>>> 9223372036854775808
9223372036854775808L

Dari manual Python :

Angka dibuat oleh literal angka atau sebagai hasil dari fungsi dan operator bawaan. Literer integer tanpa hiasan (termasuk bilangan biner, hex, dan oktal) menghasilkan bilangan bulat polos kecuali jika nilai yang ditunjukkannya terlalu besar untuk diwakili sebagai bilangan bulat biasa, dalam hal ini mereka menghasilkan bilangan bulat panjang. Bilangan bulat integer dengan 'L'atau 'l'suffix menghasilkan bilangan bulat panjang ( 'L'lebih disukai karena 1lterlihat sangat mirip dengan sebelas!).

Python berusaha sangat keras untuk berpura-pura bahwa bilangan bulatnya adalah bilangan bulat matematika dan tidak terikat. Misalnya, dapat menghitung googol dengan mudah:

>>> 10**100
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L
John Kugelman
sumber
36
Untuk menambah kebingungan, Python longtidak seperti Java long- itu agak dekat BigInteger.
NullUserException
Dalam python3, sepertinya tidak ada Lsuffix, dan itu hanya int, tidak long, tidak peduli seberapa besar jumlahnya.
Eric Wang
39

Untuk Python 3, itu

import sys
max = sys.maxsize
min = -sys.maxsize - 1
netskink
sumber
3
python 3 tidak ada. lihat stackoverflow.com/questions/13795758/…
netskink
34
yah, python 3 memang ada , untungnya (!); tetapi sys.maxinttidak ada di python 3 (tl; dr: " sys.maxintkonstanta dihapus (dalam python3), karena tidak ada lagi batas nilai integer. Namun, sys.maxsizedapat digunakan sebagai bilangan bulat yang lebih besar daripada daftar praktis atau string index. " )
michael
2
Mengapa membuat variabel yang membangun bayangan seperti min()dan max()?
RoadRunner - MSFT
1
Cari biner pujian 2
netskink
2
min = ~sys.maxsize
Andrew
10

Anda dapat menggunakan 'inf' seperti ini:

import math
bool_true = 0 < math.inf
bool_false = 0 < -math.inf

Rujuk: matematika - Fungsi matematika

Rahul Nimbal
sumber
1
Catatan yang math.infsetara denganfloat('inf')
Georgy
5

Jika Anda ingin maksimum untuk array atau daftar indeks (setara dengan size_tdalam C / C ++), Anda dapat menggunakan numpy:

np.iinfo(np.intp).max

Ini sama karena sys.maxsizebagaimanapun keuntungannya adalah Anda tidak perlu mengimpor sistem hanya untuk ini.

Jika Anda ingin maks untuk int asli pada mesin:

np.iinfo(np.intc).max

Anda dapat melihat jenis lain yang tersedia di dokumen .

Untuk mengapung Anda juga bisa menggunakan sys.float_info.max.

Shital Shah
sumber
2

Saya sangat bergantung pada perintah seperti ini.

python -c 'import sys; print(sys.maxsize)'

Maks int dikembalikan: 9223372036854775807

Untuk referensi lebih lanjut untuk 'sistem' Anda harus mengakses

https://docs.python.org/3/library/sys.html

https://docs.python.org/3/library/sys.html#sys.maxsize

Wender
sumber
1
No - maxsize hanyalah indeks kontainer terbesar yang mungkin. Python akan dengan senang hati bekerja dengan bilangan bulat 100 digit dan lebih banyak lagi
Tony Suffolk 66