อะไรคือความแตกต่างระหว่าง "1L" และ "1"


152

ผมมักจะเห็นสัญลักษณ์1L(หรือ2L, 3Lฯลฯ ) ปรากฏในรหัส R อะไรคือความแตกต่างระหว่าง1Lและ1? ประเมิน1==1L TRUEเหตุใดจึง1Lใช้รหัส R


18
หมายเหตุ: 1 == 1Lให้TRUEแต่ให้identical(1, 1L) FALSE
CJB

2
ดูเพิ่มเติมที่l ใน R
Henrik

คำตอบ:


129

@James และ @Brian อธิบายว่า 3L หมายถึงอะไร แต่ทำไมคุณถึงใช้มัน?

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

ส่วนใหญ่จะใช้เมื่อทำงานกับดัชนี นี่คือตัวอย่างที่การเพิ่ม 1 ลงในเวกเตอร์จำนวนเต็มจะเปลี่ยนเป็นเวกเตอร์คู่:

x <- 1:100
typeof(x) # integer

y <- x+1
typeof(y) # double, twice the memory size
object.size(y) # 840 bytes (on win64) 

z <- x+1L
typeof(z) # still integer
object.size(z) # 440 bytes (on win64) 

... แต่โปรดทราบด้วยว่าการทำงานกับจำนวนเต็มมากเกินไปอาจเป็นอันตรายได้:

1e9L * 2L # Works fine; fast lean and mean!
1e9L * 4L # Ooops, overflow!

... และตามที่ @Ginin ชี้ให้เห็นช่วงของจำนวนเต็มประมาณ -2e9 ถึง 2e9

ข้อแม้คือว่าสิ่งนี้นำไปใช้กับรุ่น R ปัจจุบัน (2.13) R อาจเปลี่ยนแปลงสิ่งนี้ในบางจุด (จำนวนเต็ม 64- บิตจะหวานซึ่งสามารถเปิดใช้งานเวกเตอร์ที่มีความยาว> 2e9) เพื่อความปลอดภัยคุณควรใช้.Machine$integer.maxเมื่อใดก็ตามที่คุณต้องการค่าจำนวนเต็มสูงสุด (และคัดค้านค่าต่ำสุด)


1
ผมคิดว่าความต้องการหน่วยความจำโดย R object.sizeเหมือนกันโดยไม่คำนึงถึงชนิดอย่างน้อยตาม สิ่งที่มีประโยชน์คือส่งผ่านไปยัง Fortran หรือรหัส C ซึ่งอาจต้องใช้ข้อมูลบางประเภท
James

2
ไม่ลองobject.size(1:100)กับobject.size(1:100+0)มัน 400 ไบต์ + ค่าใช้จ่ายบางส่วนกับ 800 ไบต์ + ค่าใช้จ่ายบางส่วน ฉันอัปเดตตัวอย่างด้านบน
ทอมมี่

2
เป็นมูลค่าการกล่าวขวัญว่าจำนวนเต็มล้นเกิดจากการใช้จำนวนเต็ม 32- บิตที่ลงนามดังนั้น จำกัด เกี่ยวกับ +/- 2 * 10 ^ 9 แม้ใน 64- บิต R ...
Gavin Simpson

1
@Zach ก็ยังเป็นจำนวนมากสั้นประเภท :-)
กาวินซิมป์สัน

1
@ กาวินซิมป์สันแน่นอน ฉันถูกจริงๆคิดว่าสถานการณ์ที่คุณสร้างเวกเตอร์ทั้งหมดเช่นVSc(1L, 2L, 3L, 4L,...100L) as.integer(c(1, 2, 3, 4,...100))
Zach

54

จากค่าคงที่ของข้อกำหนดภาษา R :

เราสามารถใช้คำต่อท้าย 'L' เพื่อกำหนดหมายเลขใด ๆ โดยมีเจตนาทำให้เป็นจำนวนเต็มชัดเจน ดังนั้น '0x10L' จึงสร้างค่าจำนวนเต็ม 16 จากการแสดงเลขฐานสิบหก 1e3L คงที่ให้ 1,000 เป็นจำนวนเต็มแทนที่จะเป็นค่าตัวเลขและเทียบเท่ากับ 1000L (โปรดทราบว่า 'L' ถือว่าเป็นคำที่มีคุณสมบัติ 1e3 และไม่ใช่ 3) หากเรามีคุณสมบัติด้วย 'L' ที่ไม่ใช่ค่าจำนวนเต็มเช่น 1e-3L เราจะได้รับคำเตือนและค่าตัวเลขคือ สร้าง คำเตือนจะถูกสร้างขึ้นเช่นกันหากมีจุดทศนิยมที่ไม่จำเป็นในจำนวนเช่น 1.L


46

L ระบุประเภทจำนวนเต็มแทนที่จะเป็นสองเท่าของคลาสตัวเลขมาตรฐาน

> str(1)
 num 1
> str(1L)
 int 1

2

ในการสร้างค่าจำนวนเต็มอย่างชัดเจนสำหรับค่าคงที่คุณสามารถเรียกใช้ฟังก์ชัน as.integer หรือมากกว่านั้นโดยใช้คำต่อท้าย "L"

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