ค่าสูงสุดและต่ำสุดสำหรับ ints


745

ฉันกำลังมองหาค่าต่ำสุดและสูงสุดสำหรับจำนวนเต็มในหลาม สำหรับเช่น. ใน Java เรามีและInteger.MIN_VALUE Integer.MAX_VALUEมีอะไรแบบนี้ในไพ ธ อนไหม


14
โปรดทราบว่าใน Python 3 intประเภทนั้นโดยทั่วไปเหมือนกับlongประเภทใน Python 2 ดังนั้นแนวคิดของจำนวนสูงสุดหรือต่ำสุดintจะหายไปโดยสิ้นเชิง โดยทั่วไปแล้วจะไม่เกี่ยวข้องแม้แต่กับ Python 2
agf

8
@agf: มันมีความเกี่ยวข้องในรูปแบบต่างๆ ตัวอย่างเช่นในอัลกอริทึมที่ต้องการบันทึกค่าต่ำสุดที่พบ (เช่นอัลกอริทึมการเรียงลำดับ) ค่าต่ำสุดสามารถเริ่มต้นได้ที่ sys.maxint ดังนั้นจึงรับประกันได้ว่าค่าแรกใด ๆ ที่พบจะถูกนำมาเป็นขั้นต่ำ
Basile Perrenoud

@Toaster ยกเว้นว่าคุณสามารถมีรายชื่อที่ทุกค่ามากกว่าsys.maxintเพราะมันเป็นเพียงสูงสุดสำหรับintประเภทเกี่ยวกับงูหลาม 2 longซึ่งงูหลามเงียบจะส่งเสริมให้เป็น
agf

30
หากคุณจำเป็นต้องใช้ "ค่าที่สูงมาก" ในอัลกอริทึมเช่นการค้นหาขั้นต่ำหรือสูงสุดของคอลเลกชันทั่วไปfloat('inf')หรือfloat('-inf')อาจเป็นประโยชน์มาก
geoff

1
อาจเป็นไปได้ซ้ำกับช่วงจำนวนเต็ม
Waldir Leoncio

คำตอบ:


853

Python 3

ใน Python 3 คำถามนี้ใช้ไม่ได้ intชนิดธรรมดาถูก จำกัด

อย่างไรก็ตามคุณอาจกำลังค้นหาข้อมูลเกี่ยวกับขนาดคำของล่ามปัจจุบันซึ่งจะเหมือนกับขนาดคำของเครื่องในกรณีส่วนใหญ่ ข้อมูลนั้นยังคงมีอยู่ใน Python 3 sys.maxsizeซึ่งเป็นค่าสูงสุดที่สามารถแทนได้ด้วยคำที่ลงนาม เท่ากับขนาดของรายการที่ใหญ่ที่สุดหรือลำดับในหน่วยความจำที่เป็นไปได้

โดยทั่วไปซึ่งแสดงค่าสูงสุดโดยไม่ได้ลงนามคำจะเป็นและจำนวนของบิตในคำจะเป็นsys.maxsize * 2 + 1 math.log2(sys.maxsize * 2 + 2)ดูคำตอบนี้สำหรับข้อมูลเพิ่มเติม

Python 2

ใน Python 2 ค่าสูงสุดสำหรับintค่าธรรมดามีsys.maxintดังนี้:

>>> sys.maxint
9223372036854775807

คุณสามารถคำนวณค่าต่ำสุดที่มี-sys.maxint - 1ตามที่แสดงไว้ที่นี่

Python เปลี่ยนจากเลขจำนวนเต็มธรรมดาเป็นแบบยาวได้อย่างราบรื่นเมื่อคุณเกินค่านี้ ดังนั้นส่วนใหญ่คุณไม่จำเป็นต้องรู้


177
หมายเลขนี้อาจปรากฏขึ้นโดยพลการ แต่ไม่เป็นเช่นนั้น 9223372036854775807 นั้นแน่นอน2^63 - 1ดังนั้นคุณจึงมี 64- บิต โดยทั่วไป n บิตจำนวนเต็มมีค่าตั้งแต่การ-2^(n-1) 2^(n-1) - 1
NullUserException

22
โปรดทราบว่าหากคุณใช้ Python runtime 32 บิต sys.maxint จะกลับมา2^31 - 1แม้ว่า Python จะข้ามไปที่ 64 บิตอย่างราบรื่นกับlongประเภทข้อมูล
Scott Stafford

19
ใช้sys.maxsizeแทนตามที่แนะนำโดย @Akash Rana มันมีอยู่ใน Python 2 เช่นเดียวกับsysเอกสารพูด สิ่งนี้จะทำให้โค้ดเข้ากันได้กับ Python ทั้งสองเวอร์ชั่นมากขึ้น
Ioannis Filippidis

6
คุณและฉันมีการตีความที่แตกต่างกันของบรรทัดนั้นจากเอกสาร การแทนที่2to3เป็นฮิวริสติกแบบรวดเร็วและสกปรกที่ดีซึ่งจะไม่ทำลายอะไรเลยในเวลาส่วนใหญ่ แต่ความแตกต่างระหว่างค่านิยมทั้งสองนี้มีความสำคัญ แนวทางปฏิบัติที่ดีที่สุดคือการใช้คุณค่าที่คุณตั้งใจจะใช้ ถ้าคุณต้องการอย่างแท้จริง sys.maxintในหลาม 2 คุณจะไม่จำเป็นอีกต่อไปในหลาม 3 sys.maxsizeและมันควรจะถูกลบออกทั้งหมดไม่ได้เปลี่ยนไป
senderle

3
minsize - การคูณด้วยตัวดำเนินการ Bitwise min ให้ minsize ~ sys.maxsize
om471987

238

หากคุณต้องการหมายเลขที่ใหญ่กว่าหมายเลขอื่นคุณสามารถใช้

float('inf')

ในลักษณะที่คล้ายกันจำนวนที่น้อยกว่าคนอื่น ๆ ทั้งหมด:

float('-inf')

ใช้ได้ทั้ง python 2 และ 3


9
เพียงแค่มีข้อความ (ที่ไม่เกี่ยวข้อง แต่ก็ยัง): float ('inf')> float ('inf') ให้ผลลัพธ์เป็น 'false' จำนวนอนันต์ควรมากกว่าจำนวนอนันต์อื่น :-D ... ภาพรวมจิตใจ
Scre

11
@Scre คุณคาดหวังอะไรอีก x > xเป็นปกติFalseและไม่ จำกัด ไม่มีข้อยกเว้น ( float('NaN)ในทางกลับกัน ... )
jamesdlin

6
นี้ที่จริงไม่ได้นำไปใช้สำหรับintcauze cannot convert infinite float to int... แต่การทำงานสำหรับกรณีส่วนใหญ่
เลห์

5
โปรดทราบว่าint('inf')ไม่ทำงาน
Tom Hale

3
นี่ไม่ใช่คำตอบสำหรับคำถาม OP
ghosh

225

sys.maxintคงถูกลบออกจากงูหลาม 3.0 sys.maxsizeเป็นต้นไปใช้แทน

จำนวนเต็ม

  • PEP 237: โดยพื้นฐานแล้วเปลี่ยนชื่อเป็น long นั่นคือมีชนิดอินทิกรัลในตัวเดียวชื่อ int; แต่ส่วนใหญ่จะทำงานเหมือนแบบยาวแบบเก่า
  • PEP 238: การแสดงออกเช่น 1/2 ส่งคืนค่าลอย ใช้ 1 // 2 เพื่อให้ได้พฤติกรรมการตัดทอน (ไวยากรณ์หลังมีมานานหลายปีอย่างน้อยตั้งแต่ Python 2.2)
  • ค่าคงที่ sys.maxint ถูกลบเนื่องจากไม่มีการ จำกัด ค่าของจำนวนเต็มอีกต่อไป อย่างไรก็ตาม sys.maxsize สามารถใช้เป็นจำนวนเต็มมากกว่ารายการที่ใช้งานได้จริงหรือดัชนีสตริง มันสอดคล้องกับขนาดจำนวนเต็ม“ ธรรมชาติ” ของการใช้งานและโดยทั่วไปจะเหมือนกับ sys.maxint ในรีลีสก่อนหน้าบนแพลตฟอร์มเดียวกัน (สมมติว่าเป็นตัวเลือกบิลด์เดียวกัน)
  • repr () ของจำนวนเต็มแบบยาวไม่รวม L ต่อท้ายอีกต่อไปดังนั้นโค้ดที่ตัดโดยไม่มีเงื่อนไขอักขระนั้นจะตัดหลักสุดท้ายแทน (ใช้ str () แทน)
  • ตัวอักษรฐานแปดไม่มีอยู่ในแบบฟอร์ม 0720 อีกต่อไป ใช้ 0o720 แทน

อ้างอิง: https://docs.python.org/3/whatsnew/3.0.html#integers


1
แก้ไข. แท้จริงจากhelp(sys): maxsize - ความยาวได้รับการสนับสนุนที่ใหญ่ที่สุดของภาชนะบรรจุ นี่ควรเป็นคำตอบที่ยอมรับได้
Marco Sulla

77

ในจำนวนเต็มหลามจะเปลี่ยนจากการintแสดงขนาดคงที่เป็นการlongแสดงความกว้างของตัวแปรทันทีที่คุณส่งค่าsys.maxintซึ่งเป็น 2 31 - 1 หรือ 2 63 - 1 ขึ้นอยู่กับแพลตฟอร์มของคุณ แจ้งให้ทราบLว่าได้รับการผนวกที่นี่:

>>> 9223372036854775807
9223372036854775807
>>> 9223372036854775808
9223372036854775808L

จากคู่มือ Python :

ตัวเลขถูกสร้างขึ้นโดยตัวอักษรตัวเลขหรือเป็นผลมาจากฟังก์ชั่นในตัวและตัวดำเนินการ ตัวอักษรจำนวนเต็มที่ไม่มีการตกแต่ง (รวมถึงเลขฐานสองฐานสิบหกและเลขฐานแปด) ให้ผลเป็นจำนวนเต็มธรรมดายกเว้นว่าค่าที่พวกเขาระบุนั้นมีขนาดใหญ่เกินกว่าที่จะแสดงเป็นจำนวนเต็มธรรมดาได้ จำนวนเต็มตามตัวอักษรด้วย'L'หรือ'l'ต่อท้ายให้จำนวนเต็มยาว ( 'L'เป็นที่ต้องการเพราะ1lดูมากเกินไปเช่นสิบเอ็ด!)

Python พยายามอย่างหนักที่จะแกล้งทำเป็นจำนวนเต็มเป็นจำนวนเต็มทางคณิตศาสตร์และไม่มีขอบเขต ตัวอย่างเช่นสามารถคำนวณgoogolได้อย่างง่ายดาย:

>>> 10**100
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L

36
เพื่อเพิ่มความสับสน ธlongไม่ได้เป็นเช่น Java ของlong- BigIntegerมันค่อนข้างใกล้ชิดกับ
NullUserException

ใน python3 ดูเหมือนว่าไม่มีLคำต่อท้ายและเป็นเพียงแค่intไม่longว่าจะมีจำนวนเท่าใด
Eric Wang เมื่อ

39

สำหรับ Python 3 มันเป็น

import sys
max = sys.maxsize
min = -sys.maxsize - 1

3
หลาม 3 ไม่มีอยู่ ดูstackoverflow.com/questions/13795758/…
netskink

34
ดีหลาม 3 มีอยู่ , ขอบคุณ (!); แต่sys.maxintไม่มีอยู่ในหลาม 3 (tl; dr: "sys.maxintค่าคงที่ถูกลบ (ใน python3) เนื่องจากไม่มีการ จำกัด ค่าของจำนวนเต็มอีกต่อไปอย่างไรก็ตามsys.maxsizeสามารถใช้เป็นจำนวนเต็มที่มากกว่ารายการหรือสตริงที่ใช้ได้จริง ดัชนี. " )
ไมเคิล

2
เหตุใดจึงสร้างตัวแปรที่เงาบิวด์อินเช่น min()และmax()?
RoadRunner - MSFT

1
ค้นหาไบนารีชมเชย 2
netskink

2
min = ~sys.maxsize
แอนดรู


5

หากคุณต้องการ max สำหรับอาร์เรย์หรือดัชนีรายการ (เทียบเท่ากับsize_tใน C / C ++) คุณสามารถใช้จำนวน:

np.iinfo(np.intp).max

นี่เป็นเช่นเดียวกับ sys.maxsizeข้อได้เปรียบที่คุณไม่จำเป็นต้องใช้ sys สำหรับการนำเข้า

หากคุณต้องการ max สูงสุดสำหรับ native int บนเครื่อง:

np.iinfo(np.intc).max

คุณสามารถดูประเภทอื่น ๆ ที่มีอยู่ในเอกสาร

sys.float_info.maxสำหรับลอยคุณยังสามารถใช้


2

ฉันพึ่งพาคำสั่งอย่างมาก

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

Max int คืนแล้ว: 9223372036854775807

สำหรับการอ้างอิงเพิ่มเติมสำหรับ 'sys' คุณควรเข้าถึง

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

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


1
ไม่ - ขนาดสูงสุดเป็นเพียงดัชนีคอนเทนเนอร์ที่ใหญ่ที่สุดที่เป็นไปได้ Python จะทำงานร่วมกับจำนวนเต็ม 100 หลักอย่างมีความสุขและอื่น ๆ อีกมากมาย
Tony Suffolk 66
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.