Nilai maksimum untuk bilangan bulat panjang

108

Bagaimana saya dapat menetapkan nilai maksimum untuk integer panjang ke variabel, mirip, misalnya, C ++ LONG_MAX.

Sreevisakh
sumber
7
Saya tidak yakin bilangan bulat Python dibatasi sama sekali. Pada saat Anda melintasi sys.maxint itu mengubah representasi internal dari int menjadi panjang, yang memiliki presisi tidak terbatas.
tchap
Saya bertanya karena saya perlu menemukan nilai min di antara sekelompok nilai satu per satu Jadi pertama-tama saya perlu menyimpan nilai yang besar ke variabel sehingga saya dapat membandingkannya dengan yang lain
Sreevisakh
2
Untuk komentar Anda - saya merekomendasikan untuk menggunakan fungsi bawaan min.
Jiri
5
Anda tidak memerlukan nilai maksimum jika Anda hanya mencoba mencari nilai minimum, meskipun Anda memprogram dalam C ++ atau bahasa lain. Jika Anda hanya akan mengulang semua elemen, cukup gunakan elemen pertama sebagai nilai awal Anda. (Tetapi lebih baik menggunakan minfungsinya, jika Anda benar-benar ingin memprogram dengan Python!)
John Y
3
@Sreevisakh: untuk "nilai besar", gunakan tak terhingga float("inf"),. Atau lebih baik, gunakan fungsi built-in min.
Fred Foo

Jawaban:

132

Bilangan bulat panjang:

Tidak ada batasan yang ditentukan secara eksplisit. Jumlah ruang alamat yang tersedia membentuk batas praktis.
(Diambil dari situs ini ). Lihat dokumen tentang Jenis Numerik di mana Anda akan melihatnya Long integers have unlimited precision. Di Python 2, Integer akan secara otomatis beralih ke long ketika mereka tumbuh melebihi batasnya:

>>> import sys
>>> type(sys.maxsize)
<type 'int'>
>>> type(sys.maxsize+1)
<type 'long'>


untuk bilangan bulat yang kami miliki

maxint dan maxsize:

Nilai maksimum int dapat ditemukan di Python 2.x dengan sys.maxint. Itu telah dihapus dengan Python 3, tetapi sys.maxsizeseringkali dapat digunakan sebagai gantinya. Dari changelog :

Konstanta sys.maxint telah dihapus, karena tidak ada lagi batasan untuk nilai integer. Namun, sys.maxsize dapat digunakan sebagai integer yang lebih besar daripada daftar praktis atau indeks string. Ini sesuai dengan ukuran integer "natural" implementasi dan biasanya sama dengan sys.maxint pada rilis sebelumnya pada platform yang sama (dengan asumsi opsi build yang sama).

dan, bagi siapa pun yang tertarik dengan perbedaannya (Python 2.x):

sys.maxint Integer positif terbesar yang didukung oleh tipe integer reguler Python. Ini setidaknya 2 ** 31-1. Bilangan bulat negatif terbesar adalah -maxint-1 - hasil asimetri dari penggunaan aritmatika biner komplemen 2.

sys.maxsize Bilangan bulat positif terbesar yang didukung oleh jenis Py_ssize_t platform, dan dengan demikian daftar ukuran maksimum, string, dicts, dan banyak wadah lainnya dapat dimiliki.

dan untuk kelengkapannya berikut versi Python 3 :

sys.maxsize Integer yang memberikan nilai maksimum yang dapat diambil variabel dengan tipe Py_ssize_t. Biasanya 2 ^ 31 - 1 pada platform 32-bit dan 2 ^ 63 - 1 pada platform 64-bit.

mengapung:

Ada float("inf")dan float("-inf"). Ini dapat dibandingkan dengan tipe numerik lainnya:

>>> import sys
>>> float("inf") > sys.maxsize
True
keyser
sumber
Saya mencoba kode yang sama tetapi masih menunjukkan tipe sebagai int di python 3 pada mesin windows 64 bit. Alasan apa pun yang berharga untuk itu.
ManojP
1
@ManojP Itu karena tidak ada lagi batasan untuk ukuran bilangan bulat di Python 3. Lihat kutipan blok pertama. Saya akan mengedit untuk mengklarifikasi bahwa contohnya adalah Python 2
keyser
39

Python longbisa sangat besar. Jika Anda membutuhkan nilai yang lebih besar dari nilai lainnya, Anda dapat menggunakannya float('inf'), karena Python tidak kesulitan membandingkan nilai numerik dari jenis yang berbeda. Demikian pula, untuk nilai yang lebih rendah dari nilai lainnya, Anda dapat menggunakan float('-inf').

Taymon
sumber
1
jadi itu mengembalikan nilai yang sangat besar bukan?
Sreevisakh
4
Ia mengembalikan tak terhingga floating-point, yang lebih besar dari bilangan terbatas manapun.
Taymon
4
Saya harus mengatakan, jawaban ini pasti yang paling mendekati benar dalam hal menanggapi pertanyaan judul OP. Yaitu, "bagaimana Anda mendapatkan nilai sentinel Python yang akan lebih besar dari semua masukan Anda (atau setidaknya tidak lebih kecil dari nilai terbesar)?". Jadi saya telah memberikan suara positif untuk jawaban ini, tetapi saya pikir lebih baik jika OP belajar berpikir dengan Python.
John Y
Sepakat. Meskipun demikian, saya pernah berada dalam situasi di mana ini adalah satu-satunya cara untuk melakukan apa yang saya butuhkan.
Taymon
21

Jawaban langsung untuk pertanyaan judul:

Bilangan bulat tidak terbatas ukurannya dan tidak memiliki nilai maksimum dalam Python.

Jawab alamat mana yang menyatakan kasus penggunaan yang mendasari:

Menurut komentar Anda tentang apa yang Anda coba lakukan, saat ini Anda sedang memikirkan sesuatu yang serupa

minval = MAXINT;
for (i = 1; i < num_elems; i++)
    if a[i] < a[i-1]
        minval = a[i];

Itu bukan cara berpikir dengan Python. Terjemahan yang lebih baik untuk Python (tapi tetap bukan yang terbaik)

minval = a[0]  # Just use the first value
for i in range(1, len(a)):
    minval = min(a[i], a[i - 1])

Perhatikan bahwa di atas tidak menggunakan MAXINT sama sekali. Bagian solusi itu berlaku untuk bahasa pemrograman apa pun: Anda tidak perlu mengetahui nilai setinggi mungkin hanya untuk menemukan nilai terkecil dalam sebuah koleksi.

Tapi bagaimanapun, apa yang sebenarnya Anda lakukan dengan Python itu adil

minval = min(a)

Artinya, Anda sama sekali tidak menulis satu lingkaran pun. Built-in min()fungsi mendapatkan minimal seluruh koleksi.

John Y
sumber
8

longketik Python 2.x menggunakan aritmatika presisi sewenang-wenang dan tidak memiliki nilai semaksimal mungkin. Itu dibatasi oleh memori yang tersedia. Python 3.x tidak memiliki tipe khusus untuk nilai yang tidak dapat direpresentasikan oleh integer mesin asli - semuanya intdan konversi ditangani di belakang layar.

rkhayrov
sumber
7

Tidak seperti C / C ++ Long di Python memiliki presisi tak terbatas. Untuk informasi lebih lanjut, lihat bagian Jenis Numerik di python.Untuk menentukan nilai maksimal bilangan bulat, Anda bisa merujuk sys.maxint. Anda bisa mendapatkan detail lebih lanjut dari dokumentasi sys .

Abhijit
sumber
1

Anda dapat menggunakan: nilai maksimum float is

float('inf')

untuk negatif

float('-inf')
Ramadan
sumber
2
Judulnya adalah "Nilai maksimum untuk bilangan bulat panjang" , bukan nilai maksimum float. Jadi, tanpa penjelasan bagaimana ini menjawab pertanyaan, saya menganggap NAA ini (bukan jawaban).
Sнаđошƒаӽ
0

Di python3, Anda dapat mengirim nilai float ke dalam fungsi int untuk mendapatkan nomor itu 1.7976931348623157e + 308 dalam representasi integer.

import sys    
int(sys.float_info.max)
Frédéric Jacques
sumber
Ini sama sekali tidak berguna. Untuk mengilustrasikannya, coba int (sys.float_info.max) +1 dan Anda hanya akan mendapatkan bilangan bulat yang merupakan satu lagi, karena seperti yang dijelaskan oleh komentar lain Python hanya menyimpan bilangan bulat presisi tak terbatas.
tialaramex