พิกัดติดลบทำให้การคำนวณชังก์ผิดพลาด 2 จุด ไม่ใช่แค่ 1 จุด
การหารแบบตัดทศนิยมทำให้บล็อก -1 ไปอยู่ในชังก์ 0 แทนที่จะเป็น -1 และการใช้ % ธรรมดาทำให้ได้ค่าออฟเซ็ตในชังก์เป็น -1 แทนที่จะเป็น 15 ทั้งสองอย่างผิดพลาด และดูเหมือนจะถูกต้องจนกว่าคุณจะเดินทางไปทางตะวันตกของจุดเกิด
การคำนวณชังก์ทุกครั้งจะง่ายในควอดแรนต์บวกและผิดพลาดในอีกสามควอดแรนต์ที่เหลือ มีจุดที่ผิดพลาดอยู่สองจุดพอดี ซึ่งเป็นอิสระต่อกัน และทั้งสองจุดให้คำตอบที่ดูสมเหตุสมผล
การดำเนินการทั้งสอง
chunk = floor(block / 16) not trunc(block / 16)
offset = ((block % 16) + 16) % 16 not block % 16
พิกัดภูมิภาค (Region coordinates) เป็นคู่เดียวกัน แต่เป็นระดับที่สูงขึ้น โดยใช้ 32 แทน 16:
region = floor(chunk / 32) -> r.<x>.<z>.mca
regionOff = ((chunk % 32) + 32) % 32
ดังนั้นหนึ่งภูมิภาคคือ 32 × 32 ชังก์ ซึ่งเท่ากับ 512 × 512 บล็อก
จุดที่แต่ละส่วนผิดพลาด
การหาร (Division) ภาษาโปรแกรมส่วนใหญ่จะตัดทศนิยมเข้าหาศูนย์ (truncate toward zero) และ floor จะปัดเศษลงเข้าหาอนันต์ลบ (rounds toward negative infinity) ซึ่งจะตรงกันสำหรับค่าบวกและไม่ตรงกันสำหรับค่าลบทุกค่าที่ไม่ใช่พหุคูณที่แน่นอน:
- บล็อก
−1→floor(−1/16) = −1✓, แต่trunc(−1/16) = 0✗
บล็อก -1 อยู่ห่างจากจุดกำเนิดไปทางตะวันตกหนึ่งบล็อกและเป็นของชังก์ -1 การตัดทศนิยมทำให้มันอยู่ในชังก์ 0 เช่นเดียวกับบล็อก +1 ดัชนีชังก์ที่เป็นลบทุกค่าจะออกมาสูงเกินไปหนึ่งค่า
เศษเหลือ (Remainder) ใน JavaScript, Java, C และภาษาอื่นๆ ส่วนใหญ่ % จะคงเครื่องหมายของตัวถูกดำเนินการทางซ้ายไว้:
- บล็อก
−1→ ออฟเซ็ตที่ถูกต้อง15, แต่−1 % 16 = −1✗
ออฟเซ็ต -1 ไม่ใช่ตำแหน่งภายในชังก์กว้าง 16 บล็อกเลย การจัดทำดัชนีอาร์เรย์บล็อกด้วยค่านี้จะทำให้เกิดข้อผิดพลาดหรืออ่านเซลล์ผิดพลาดโดยไม่มีการแจ้งเตือน
ตัวอย่างการคำนวณ
บล็อก -1290 บนแกนหนึ่ง:
| ขั้นตอน | ถูกต้อง | แบบง่าย |
|---|---|---|
| ชังก์ | floor(−1290/16) = -81 | trunc = -80 ✗ |
| ออฟเซ็ตในชังก์ | 6 | −1290 % 16 = -10 ✗ |
| ภูมิภาค | floor(−81/32) = -3 | trunc = -2 ✗ |
| ออฟเซ็ตในภูมิภาค | 15 | −81 % 32 = -17 ✗ |
สี่ค่า สี่คำตอบที่ผิดพลาด ไม่มีค่าใดที่อยู่นอกช่วงมากพอที่จะดูผิดปกติอย่างชัดเจน ภูมิภาค -3 ครอบคลุมชังก์ -96 ถึง -65 และชังก์ -81 อยู่ห่างจากจุดเริ่มต้น 15 บล็อก ซึ่งตรงกับสิ่งที่เศษเหลือที่แก้ไขแล้วส่งคืน
การแปลงเนเธอร์มีการสูญเสียข้อมูลในทิศทางเดียว
การแปลงจากโลกปกติ (Overworld) ไปยังเนเธอร์ (Nether) จะหารด้วย 8 และปัดเศษลงด้วย:
netherX = floor(overworldX / 8)
การกลับมาจะคูณด้วย 8 ซึ่ง ไม่ใช่ การเดินทางไปกลับ floor จะทิ้งเศษที่เหลือไป ดังนั้นการกลับมาจะทำให้คุณลงจอดที่ตำแหน่งที่เป็นพหุคูณของ 8:
- โลกปกติ
1000→ เนเธอร์125→ กลับสู่1000✓ - โลกปกติ
1007→ เนเธอร์125→ กลับสู่1000✗ — สั้นไปเจ็ดบล็อก
ข้อผิดพลาดคือ 0 ถึง 7 บล็อกต่อแกน ดังนั้นอาจผิดพลาดได้สูงสุด 7 บล็อกบนแกน X และ 7 บล็อกบนแกน Z พร้อมกัน นี่คือเหตุผลทั้งหมดที่การเชื่อมโยงพอร์ทัลที่แม่นยำจำเป็นต้องจดพิกัดเนเธอร์ไว้แทนที่จะคำนวณใหม่: เมื่อคุณหารแล้ว ตำแหน่งโลกปกติที่มันมาจากจะไม่สามารถกู้คืนได้อีกต่อไป
สำหรับศูนย์กลางเนเธอร์ (Nether hub) เรื่องนี้ไม่ค่อยสำคัญนัก — 7 บล็อกยังอยู่ในรัศมีการจับภาพของพอร์ทัลเอง สำหรับการเชื่อมโยงพอร์ทัลสองแห่งที่ต้องไม่แย่งการจราจรกัน เรื่องนี้สำคัญมาก
พิกัดโลกปกติที่เป็นลบทำให้สถานการณ์แย่ลงในลักษณะที่คุ้นเคย: โลกปกติ −1 ให้เนเธอร์ floor(−1/8) = −1 ในขณะที่การตัดทศนิยมให้ 0 และส่งคุณไปยังด้านที่ผิดของแกน