ค่าสูงสุดสำหรับจำนวนเต็มยาว


108

ฉันสามารถกำหนดค่าสูงสุดสำหรับจำนวนเต็มยาวเพื่อตัวแปรที่คล้ายกันเช่นไปที่ C ++ LONG_MAX's


7
ฉันไม่แน่ใจว่าจำนวนเต็ม Python ถูก จำกัด ทั้งหมด ในขณะที่คุณข้าม sys. maxint จะเปลี่ยนการแสดงภายในจาก int เป็น long ซึ่งมี presicion ไม่ จำกัด
tchap

ฉันถามเพราะฉันต้องการหาค่าต่ำสุดในกลุ่มของค่าทีละกลุ่มก่อนอื่นฉันต้องจัดเก็บค่าขนาดใหญ่ให้กับตัวแปรเพื่อที่ฉันจะได้เปรียบเทียบกับค่าอื่น ๆ
Sreevisakh

2
ความคิดเห็นของคุณ - ฉันแนะนำให้ใช้ฟังก์ชันในตัวขั้นต่ำ
Jiri

5
คุณไม่จำเป็นต้องมีค่าสูงสุดหากคุณกำลังพยายามหาค่าต่ำสุดแม้ว่าคุณจะเขียนโปรแกรมด้วยภาษา C ++ หรือภาษาอื่นก็ตาม หากคุณจะวนซ้ำองค์ประกอบทั้งหมดต่อไปเพียงแค่ใช้องค์ประกอบแรกเป็นค่าเริ่มต้นของคุณ (แต่ดีกว่าminถ้าคุณต้องการใช้ฟังก์ชันนี้ใน Python!)
John Y

3
@Sreevisakh: สำหรับ "ค่าใหญ่" float("inf")การใช้งานอินฟินิตี้ หรือดีกว่าให้ใช้minฟังก์ชันในตัว
Fred Foo

คำตอบ:


132

จำนวนเต็มยาว:

ไม่มีขีด จำกัด ที่กำหนดไว้อย่างชัดเจน จำนวนพื้นที่ที่อยู่ที่มีอยู่จะเป็นข้อ จำกัด ในทางปฏิบัติ
(นำมาจากเว็บไซต์นี้ ) ดูเอกสารเกี่ยวกับชนิดของตัวเลขLong integers have unlimited precisionที่คุณจะเห็นว่า ใน Python 2 จำนวนเต็มจะเปลี่ยนเป็น longs โดยอัตโนมัติเมื่อเติบโตเกินขีด จำกัด :

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


สำหรับจำนวนเต็มเรามี

maxint และ maxsize:

ค่าสูงสุดของ int สามารถพบได้ใน Python 2.x ด้วยsys.maxint. มันถูกลบออกใน Python 3 แต่sys.maxsizeมักจะใช้แทนได้ จากบันทึกการเปลี่ยนแปลง :

ค่าคงที่ sys.maxint ถูกลบออกเนื่องจากไม่มีการ จำกัด ค่าของจำนวนเต็มอีกต่อไป อย่างไรก็ตาม sys.maxsize สามารถใช้เป็นจำนวนเต็มมากกว่ารายการหรือดัชนีสตริงที่ใช้ได้จริง เป็นไปตามขนาดจำนวนเต็ม "ธรรมชาติ" ของการนำไปใช้งานและโดยทั่วไปจะเหมือนกับ sys.maxint ในรุ่นก่อนหน้าบนแพลตฟอร์มเดียวกัน (สมมติว่าเป็นตัวเลือกการสร้างเดียวกัน)

และสำหรับทุกคนที่สนใจในความแตกต่าง (Python 2.x):

sys.maxintจำนวนเต็มบวกที่ใหญ่ที่สุดที่รองรับโดยประเภทจำนวนเต็มปกติของ Python นี่คืออย่างน้อย 2 ** 31-1 จำนวนเต็มลบที่ใหญ่ที่สุดคือ -maxint-1 - ความไม่สมมาตรเป็นผลมาจากการใช้เลขคณิตไบนารีเสริมของ 2

sys.maxsizeจำนวนเต็มบวกที่ใหญ่ที่สุดที่รองรับโดยประเภท Py_ssize_t ของแพลตฟอร์มดังนั้นรายการขนาดสูงสุดสตริงคำสั่งและคอนเทนเนอร์อื่น ๆ สามารถมีได้

และเพื่อความสมบูรณ์นี่คือเวอร์ชัน Python 3 :

sys.maxsize จำนวนเต็มที่ให้ค่าสูงสุดที่ตัวแปรประเภท Py_ssize_t สามารถรับได้ โดยปกติจะเป็น 2 ^ 31 - 1 บนแพลตฟอร์ม 32 บิตและ 2 ^ 63 - 1 บนแพลตฟอร์ม 64 บิต

ลอย:

มีและfloat("inf") float("-inf")สิ่งเหล่านี้สามารถเปรียบเทียบกับประเภทตัวเลขอื่น ๆ :

>>> import sys
>>> float("inf") > sys.maxsize
True

ฉันลองใช้รหัสเดียวกัน แต่ยังคงแสดงประเภทเป็น int ใน python 3 บนเครื่อง windows 64 บิต เหตุผลที่มีค่าสำหรับมัน
ManojP

1
@ManojP เป็นเพราะไม่มีการ จำกัด ขนาดของจำนวนเต็มใน Python 3 อีกต่อไปดูคำพูดบล็อกแรก ฉันจะแก้ไขเพื่อชี้แจงว่าตัวอย่างคือ Python 2
keyser

39

Python longสามารถมีขนาดใหญ่ได้ตามอำเภอใจ หากคุณต้องการค่าที่มากกว่าค่าอื่น ๆ คุณสามารถใช้ได้float('inf')เนื่องจาก Python ไม่มีปัญหาในการเปรียบเทียบค่าตัวเลขประเภทต่างๆ ในทำนองเดียวกันสำหรับค่าที่น้อยกว่าค่าอื่น ๆ คุณสามารถfloat('-inf')ใช้ได้


1
ดังนั้นมันจึงส่งคืนค่าที่มากหรือไม่?
Sreevisakh

4
มันจะส่งกลับค่าอนันต์จุดลอยตัวซึ่งมากกว่าจำนวน จำกัด ใด ๆ
Taymon

4
ฉันต้องบอกว่าคำตอบนี้เป็นคำตอบที่ถูกต้องที่สุดในแง่ของการตอบคำถามหัวข้อของ OP นั่นคือ "คุณจะได้รับค่า Python sentinel ที่มีขนาดใหญ่กว่าอินพุตทั้งหมดของคุณได้อย่างไร (หรืออย่างน้อยก็ไม่น้อยกว่าค่าที่ใหญ่ที่สุด)" ดังนั้นฉันจึงเพิ่มคะแนนให้คำตอบนี้ แต่ฉันคิดว่ามันจะดีกว่าถ้า OP เรียนรู้ที่จะคิดใน Python แทน
John Y

เห็นด้วย ที่กล่าวว่าฉันอยู่ในสถานการณ์ที่นี่เป็นวิธีเดียวที่จะทำในสิ่งที่ฉันต้องการ
Taymon

21

คำตอบโดยตรงสำหรับคำถามชื่อเรื่อง:

จำนวนเต็มมีขนาดไม่ จำกัด และไม่มีค่าสูงสุดใน Python

ตอบที่อยู่ที่ระบุกรณีการใช้งาน:

ตามความคิดเห็นของคุณเกี่ยวกับสิ่งที่คุณกำลังพยายามทำขณะนี้คุณกำลังคิดอะไรบางอย่างตามแนวของ

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

นั่นไม่ใช่วิธีคิดใน Python การแปล Python ที่ดีกว่า (แต่ยังไม่ดีที่สุด) จะเป็น

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

โปรดทราบว่าข้างต้นไม่ได้ใช้ MAXINT เลย ส่วนหนึ่งของโซลูชันนี้ใช้กับภาษาโปรแกรมใด ๆ : คุณไม่จำเป็นต้องทราบค่าสูงสุดที่เป็นไปได้เพียงเพื่อค้นหาค่าที่น้อยที่สุดในคอลเล็กชัน

แต่อย่างไรก็ตามสิ่งที่คุณจริงๆทำในหลามเป็นเพียง

minval = min(a)

นั่นคือคุณไม่ได้เขียนวนซ้ำเลย min()ฟังก์ชันในตัวจะได้รับค่าต่ำสุดของคอลเลคชันทั้งหมด


8

longพิมพ์ใน Python 2.x ใช้เลขคณิตที่มีความแม่นยำโดยพลการและไม่มีค่าที่เป็นไปได้สูงสุด ถูก จำกัด ด้วยหน่วยความจำที่มีอยู่ Python 3.x ไม่มีประเภทพิเศษสำหรับค่าที่ไม่สามารถแสดงด้วยจำนวนเต็มเครื่องดั้งเดิม - ทุกอย่างเป็นอยู่intและการแปลงจะได้รับการจัดการเบื้องหลัง


7

ซึ่งแตกต่างจาก C / C ++ Long ใน Python มีความแม่นยำไม่ จำกัด อ้างถึงส่วนประเภทตัวเลข ใน python สำหรับข้อมูลเพิ่มเติมในการกำหนดค่าสูงสุดของจำนวนเต็มคุณสามารถอ้างอิงsys.maxintได้ คุณจะได้รับรายละเอียดเพิ่มเติมจากเอกสารของSYS


1

คุณสามารถใช้: ค่าสูงสุดของลูกลอยคือ

float('inf')

สำหรับเชิงลบ

float('-inf')

2
ชื่อเรื่องคือ"ค่าสูงสุดสำหรับจำนวนเต็มยาว"ไม่ใช่ค่าสูงสุดของจำนวนทศนิยม ดังนั้นหากไม่มีคำอธิบายว่าสิ่งนี้ตอบคำถามอย่างไรฉันจึงถือว่า NAA นี้ (ไม่ใช่คำตอบ)
Sнаđошƒаӽ

0

ใน python3 คุณสามารถส่งค่า float ไปยังฟังก์ชัน int เพื่อรับหมายเลขนั้น 1.7976931348623157e + 308 ในการแทนค่าจำนวนเต็ม

import sys    
int(sys.float_info.max)

สิ่งนี้ไม่ได้ทำประโยชน์อะไรเลย เพื่อเป็นตัวอย่างให้ลอง int (sys.float_info.max) +1 และคุณจะได้รับจำนวนเต็มซึ่งมากกว่าหนึ่งเนื่องจากตามที่ความคิดเห็นอื่น ๆ อธิบาย Python จะเก็บจำนวนเต็มที่มีความแม่นยำไม่ จำกัด เท่านั้น
tialaramex
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.