ความแตกต่างระหว่าง Int และ Integer คืออะไร?


คำตอบ:


184

"จำนวนเต็ม" เป็นประเภทที่มีความแม่นยำโดยพลการ: มันจะเก็บหมายเลขใด ๆ ไว้ไม่ว่าจะมีขนาดใหญ่เท่าใดก็ตามจนถึงขีด จำกัด หน่วยความจำของเครื่องของคุณ ... นี่หมายความว่าคุณไม่เคยมีปัญหาทางคณิตศาสตร์มากเกินไป ในทางกลับกันก็หมายความว่าเลขคณิตของคุณค่อนข้างช้า ผู้ใช้เสียงกระเพื่อมอาจรู้จักชนิด "bignum" ที่นี่

"Int" เป็นจำนวนเต็ม 32 หรือ 64 บิตโดยทั่วไป การใช้งานแตกต่างกันไปแม้ว่าจะรับประกันว่าจะมีอย่างน้อย 30 บิต

ที่มา: Haskell วิกิตำรา นอกจากนี้คุณอาจพบว่าส่วนตัวเลขของA Gentle Introduction to Haskellมีประโยชน์


ตามคำตอบนี้การใช้งานIntegerมักจะเร็วกว่าที่เป็นอยู่
Maarten

6
@Maarten นั่นเป็นเพียงเพราะInt64มีการใช้งานค่อนข้างไม่ดีในระบบ 32 บิต สำหรับระบบ 64 บิตมันยอดเยี่ยมมาก
dfeuer

22

IntคือBoundedซึ่งหมายความว่าคุณสามารถใช้minBoundและmaxBoundค้นหาข้อ จำกัด ซึ่งขึ้นอยู่กับการใช้งาน แต่รับประกันว่าจะมีอย่างน้อย [-2 29 .. 2 29 -1]

ตัวอย่างเช่น:

Prelude> (minBound, maxBound) :: (Int, Int)
(-9223372036854775808,9223372036854775807)

แต่เป็นความแม่นยำโดยพลการและไม่IntegerBounded

Prelude> (minBound, maxBound) :: (Integer, Integer)

<interactive>:3:2:
    No instance for (Bounded Integer) arising from a use of `minBound'
    Possible fix: add an instance declaration for (Bounded Integer)
    In the expression: minBound
    In the expression: (minBound, maxBound) :: (Integer, Integer)
    In an equation for `it':
        it = (minBound, maxBound) :: (Integer, Integer)

20

Intเป็นชนิดของจำนวนเต็มของเครื่องโดยมีช่วงการรับประกันอย่างน้อย-229ถึง 2 29 - 1 ในขณะที่Integerเป็นจำนวนเต็มที่มีความแม่นยำตามอำเภอใจโดยมีช่วงที่มีขนาดใหญ่เท่ากับหน่วยความจำ

https://mail.haskell.org/pipermail/haskell-cafe/2005-May/009906.html


10

Int คือ C int ซึ่งหมายถึงค่าอยู่ในช่วง -2147483647 ถึง 2147483647 ในขณะที่จำนวนเต็มตั้งแต่ชุดZทั้งหมดหมายความว่ามันสามารถมีขนาดใหญ่โดยพลการ

$ ghci
Prelude> (12345678901234567890 :: Integer, 12345678901234567890 :: Int)
(12345678901234567890,-350287150)

สังเกตเห็นคุณค่าของตัวอักษร Int


2
GHCi รุ่น 7.10.3 ให้คำเตือน: ตัวอักษร 12345678901234567890 อยู่นอกช่วง Int -9223372036854775808..9223372036854775807
Adam

5

โหมโรงกำหนดประเภทตัวเลขพื้นฐานที่สุดเท่านั้น: จำนวนเต็มขนาดคงที่ (Int), จำนวนเต็มความแม่นยำโดยพลการ (จำนวนเต็ม), ...

...

ประเภทจำนวนเต็มความแม่นยำ จำกัด ของ Int ครอบคลุมช่วงอย่างน้อย [- 2 ^ 29, 2 ^ 29 - 1]

จากรายงาน Haskell: http://www.haskell.org/onlinereport/basic.html#numbers


4

Integerถูกนำไปใช้งานInt#จนกว่าจะได้รับมากกว่าค่าสูงสุดที่Int#สามารถจัดเก็บได้ ณ จุดนั้นมันเป็นหมายเลขGMP


2
เสียงนี้ใช้งานเฉพาะ มีการอ้างอิงที่บอกว่าจำเป็นต้องใช้ Integer ด้วยวิธีนี้หรือไม่?
yoniLavi

4
ไม่คุณพูดถูกนี่เป็นเฉพาะ GHC ที่กล่าวว่า 1. GHC เป็นสิ่งที่คนส่วนใหญ่ใช้ 2. นี่เป็นวิธีที่ฉลาดที่สุดที่ฉันสามารถคิดได้ในการใช้ชนิดข้อมูลดังกล่าว
Nate Symer

นี่หมายความว่า (ใน GHC) ไม่มีการแลกเปลี่ยนประสิทธิภาพสำหรับการใช้Integerงานและดังนั้นจึงIntegerเป็นตัวเลือกที่ดีกว่าเสมอ
Kirk Broadhurst
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.