อะไรคือความแตกต่างระหว่างคลาสจำนวนเต็มและคลาสตัวเลขใน R


96

ฉันต้องการนำเสนอสิ่งนี้โดยบอกว่าฉันเป็นผู้เริ่มต้นการเขียนโปรแกรมอย่างแท้จริงดังนั้นโปรดแก้ตัวว่าคำถามนี้เป็นอย่างไร

ฉันพยายามทำความเข้าใจเกี่ยวกับคลาส "อะตอม" ใน R ให้ดีขึ้นและอาจจะใช้กับคลาสในการเขียนโปรแกรมโดยทั่วไป ฉันเข้าใจความแตกต่างระหว่างคลาสข้อมูลแบบอักขระตรรกะและแบบซับซ้อน แต่ฉันกำลังดิ้นรนเพื่อค้นหาความแตกต่างพื้นฐานระหว่างคลาสตัวเลขและคลาสจำนวนเต็ม

สมมติว่าฉันมีเวกเตอร์x <- c(4, 5, 6, 6)ของจำนวนเต็มอย่างง่ายมันก็สมเหตุสมผลที่นี่จะเป็นคลาสจำนวนเต็ม แต่เมื่อฉันทำฉันได้รับclass(x) แล้วถ้าฉันจะแปลงเวกเตอร์นี้เพื่อชั้นจำนวนเต็ม[1] "numeric" x <- as.integer(x)มันจะส่งคืนรายการตัวเลขเหมือนกันยกเว้นคลาสจะแตกต่างกัน

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


4
ไม่as.integer(c(4.1, 5.2, 6.3, 6.4))ช่วยให้คุณทำความเข้าใจความแตกต่าง? คุณต้องเข้าใจว่าการแสดงภายในและสิ่งที่พิมพ์ไม่เหมือนกันเลย อย่างไรก็ตามอ่านเกี่ยวกับประเภทข้อมูลในภาษาคอมพิวเตอร์บ้าง
Roland

ในคอลัมน์ "ที่เกี่ยวข้อง" ทางด้านขวาคือคำถาม: stackoverflow.com/questions/8804779/…
Matthew Lundberg

1
ลองx <- 1; is.integer(x); is.numeric(x)แล้วx <- 1L; is.integer(x); is.numeric(x)คุณอาจจะเห็นความแตกต่างเล็กน้อย คลาสจำนวนเต็มถูกใช้มากขึ้นเพื่อส่งผ่านตัวแปรจากโครงสร้าง C และในโครงสร้าง R แม้ว่าจะมีอะไรมากกว่านี้
Rich Scriven

@ โรแลนด์ฉันไม่ได้คิดเกี่ยวกับคลาสที่ระบุความแม่นยำ ฉันคุ้นเคยกับการใช้วิธีการลอยเพื่อจัดการกับชั้นเรียนจำนวนเต็ม มันสมเหตุสมผล
Keon

คำตอบ:


87

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

บางครั้งคุณอาจต้องการจัดเก็บเวกเตอร์เป็นจำนวนเต็มโดยเฉพาะหากคุณรู้ว่าจะไม่ถูกแปลงเป็นค่าสองเท่า (ใช้เป็นค่า ID หรือการจัดทำดัชนี) เนื่องจากจำนวนเต็มต้องการพื้นที่จัดเก็บน้อย แต่ถ้าจะใช้ในการคำนวณทางคณิตศาสตร์ใด ๆ ที่จะแปลงให้เป็นสองเท่าก็น่าจะเร็วที่สุดที่จะเก็บไว้เป็นสองเท่าเพื่อเริ่มต้นด้วย


47

ก่อนอื่นมันเป็นไปได้อย่างสมบูรณ์แบบที่จะใช้ R ได้สำเร็จเป็นเวลาหลายปีและไม่จำเป็นต้องรู้คำตอบสำหรับคำถามนี้ R จัดการความแตกต่างระหว่างตัวเลข (ปกติ) และจำนวนเต็มให้คุณอยู่เบื้องหลัง

> is.numeric(1)

[1] TRUE

> is.integer(1)

[1] FALSE

> is.numeric(1L)

[1] TRUE

> is.integer(1L)

[1] TRUE

(การใส่ทุน 'L' หลังจำนวนเต็มบังคับให้เก็บเป็นจำนวนเต็ม)

ดังที่คุณเห็น "จำนวนเต็ม" เป็นส่วนย่อยของ "ตัวเลข"

> .Machine$integer.max

[1] 2147483647

> .Machine$double.xmax

[1] 1.797693e+308

จำนวนเต็มมีค่ามากกว่า 2 พันล้านเล็กน้อยเท่านั้นในขณะที่ตัวเลขอื่น ๆ อาจใหญ่กว่านี้มาก อาจมีขนาดใหญ่ขึ้นเนื่องจากถูกจัดเก็บเป็นตัวเลขทศนิยมที่มีความแม่นยำสองเท่า ซึ่งหมายความว่าตัวเลขจะถูกจัดเก็บเป็นสองส่วน ได้แก่ เลขชี้กำลัง (เช่น 308 ด้านบนยกเว้นในฐาน 2 แทนที่จะเป็นฐาน 10) และ "นัยสำคัญ" (เช่น 1.797693 ด้านบน)

โปรดทราบว่า 'is.integer' ไม่ใช่การทดสอบว่าคุณมีจำนวนเต็มหรือไม่ แต่เป็นการทดสอบวิธีจัดเก็บข้อมูล

สิ่งหนึ่งที่ต้องระวังคือตัวดำเนินการโคลอน:จะส่งคืนจำนวนเต็มหากจุดเริ่มต้นและจุดสิ้นสุดเป็นจำนวนเต็ม ยกตัวอย่างเช่นการ1:5สร้างintegerเวกเตอร์ของตัวเลขจาก 1 ถึง 5 Lคุณไม่จำเป็นต้องผนวกตัวอักษร

> class(1:5)
[1] "integer"

อ้างอิง: https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R


11
เอามาจาก Quora post ใช่มั้ย? คุณสามารถพูดถึงข้อมูลอ้างอิงได้!
Srujan Barai


4

หากต้องการอ้างอิงหน้าความช่วยเหลือ (ลอง?integer) ส่วนที่เป็นตัวหนาของฉัน:

เวกเตอร์จำนวนเต็มมีอยู่เพื่อให้ข้อมูลที่สามารถส่งผ่านไปยัง C หรือ Fortran รหัสซึ่งคาดว่าพวกเขาและเพื่อให้(เล็ก) จำนวนเต็มข้อมูลที่สามารถแสดงว่าและดาน

โปรดทราบว่าการนำไปใช้งานในปัจจุบันของ R ใช้จำนวนเต็ม 32 บิตสำหรับเวกเตอร์จำนวนเต็มดังนั้นช่วงของจำนวนเต็มที่แสดงได้จึง จำกัด ไว้ที่ประมาณ +/- 2 * 10 ^ 9: คู่ผสมสามารถเก็บจำนวนเต็มที่ใหญ่กว่าได้มาก

เช่นเดียวกับที่หน้าวิธีใช้กล่าวว่า R's integerมีการลงนามหมายเลข 32 บิตดังนั้นจึงสามารถถือได้ระหว่าง -2147483648 ถึง +2147483647 และใช้พื้นที่ 4 ไบต์

R numericนั้นเหมือนกับ 64 บิตที่เป็นdoubleไปตามมาตรฐาน IEEE 754 R ไม่มีชนิดข้อมูลที่มีความแม่นยำเดียว (ที่มา: หน้าความช่วยเหลือของnumericและdouble) คู่สามารถเก็บจำนวนเต็มทั้งหมดระหว่าง -2 ^ 53 และ 2 ^ 53 ได้อย่างแน่นอนโดยไม่สูญเสียความแม่นยำ

เราสามารถดูขนาดประเภทข้อมูลรวมถึงค่าใช้จ่ายของเวกเตอร์ ( แหล่งที่มา ):

> object.size(1:1000)
4040 bytes
> object.size(as.numeric(1:1000))
8040 bytes

1

ตามความเข้าใจของฉัน - เราไม่ได้ประกาศตัวแปรที่มีประเภทข้อมูลดังนั้นโดยค่าเริ่มต้น R จึงตั้งค่าตัวเลขใด ๆ ที่ไม่มี L ให้เป็นตัวเลข ถ้าคุณเขียน:

> x <- c(4L, 5L, 6L, 6L)
> class(x)
>"integer" #it would be correct

ตัวอย่างจำนวนเต็ม:

> x<- 2L
> print(x)

ตัวอย่างตัวเลข (เช่น double / float จากภาษาโปรแกรมอื่น ๆ )

> x<-3.4
> print(x)

ระวังช่วงเช่น1:5จะสร้างจำนวนเต็ม
qwr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.