ऋणात्मक निर्देशांक चंक के गणित को एक नहीं, दो जगहों पर बिगाड़ते हैं
ट्रंकेटिंग विभाजन ब्लॉक −1 को −1 के बजाय चंक 0 में रख देता है, और एक सामान्य % 15 के बजाय −1 का इन-चंक ऑफ़सेट देता है। दोनों गलत हैं, और दोनों तब तक सही लगते हैं जब तक आप स्पॉन के पश्चिम में नहीं जाते।
सकारात्मक चतुर्थांश में हर चंक की गणना आसान होती है और बाकी तीन में गलत होती है। यह ठीक दो जगहों पर गलत होती है, वे एक-दूसरे से स्वतंत्र हैं, और दोनों ऐसे उत्तर देती हैं जो सही लगते हैं।
दो ऑपरेशन
chunk = floor(block / 16) not trunc(block / 16)
offset = ((block % 16) + 16) % 16 not block % 16
रीजन के निर्देशांक वही जोड़ी हैं, एक स्तर ऊपर, 16 के बजाय 32 के साथ:
region = floor(chunk / 32) -> r.<x>.<z>.mca
regionOff = ((chunk % 32) + 32) % 32
तो एक रीजन 32 × 32 चंक का होता है, जो 512 × 512 ब्लॉक होते हैं।
गलती कहाँ असर करती है
विभाजन। ज़्यादातर भाषाएँ शून्य की ओर ट्रंकेट करती हैं, और floor rounds toward negative infinity. They agree for positives and disagree for every negative that is not an exact multiple:
- ब्लॉक
−1→floor(−1/16) = −1✓, buttrunc(−1/16) = 0✗
ब्लॉक −1 मूल बिंदु के पश्चिम में एक ब्लॉक है और चंक −1 का हिस्सा है। ट्रंकेशन इसे ब्लॉक +1 के साथ चंक 0 में रख देता है। प्रत्येक ऋणात्मक चंक इंडेक्स एक मान अधिक निकलता है।
शेषफल। JavaScript, Java, C और अधिकांश अन्य में, % keeps the sign of the left operand:
- ब्लॉक
−1→ correct offset15, but−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 अंदर है — जो कि सुधारे गए शेषफल द्वारा लौटाया गया सटीक मान है।
Nether रूपांतरण एक दिशा में विकृत होता है
Overworld से Nether में 8 से भाग होता है, और यह फ़्लोर भी करता है:
netherX = floor(overworldX / 8)
वापस आने पर 8 से गुणा होता है। यह नहीं है एक राउंड ट्रिप। floor throws away the remainder, so returning lands you on a multiple of 8:
- Overworld
1000→ Nether125→ back to1000✓ - Overworld
1007→ Nether125→ back to1000✗ — seven blocks short
त्रुटि प्रति अक्ष 0 से 7 ब्लॉक तक होती है, यानी X पर 7 और Z पर एक साथ 7 तक। यही मुख्य कारण है कि सटीक पोर्टल लिंकिंग के लिए Nether निर्देशांक को दोबारा निकालने के बजाय लिखकर रखने की आवश्यकता होती है: एक बार विभाजित करने के बाद, मूल Overworld स्थिति को फिर से प्राप्त नहीं किया जा सकता।
Nether हब के लिए इससे शायद ही कोई फ़र्क पड़ता है — 7 ब्लॉक पोर्टल के अपने कैप्चर रेडियस के अंदर होते हैं। लेकिन दो ऐसे पोर्टलों को जोड़ने के लिए जो एक-दूसरे के ट्रैफ़िक को न चुराएं, यह बहुत मायने रखता है।
ऋणात्मक Overworld निर्देशांक इसे जाने-पहचाने तरीके से और बिगाड़ देते हैं: Overworld −1 gives Nether floor(−1/8) = −1, while truncation gives 0 and sends you to the wrong side of the axis.