มีคำตอบที่ดีเกี่ยวกับจำนวนเต็มอยู่แล้ว แต่ฉันรู้สึกว่าจุดลอยไม่ควรถูกกำจัด ในคำตอบของเขา Byte56 ได้เลือกที่จะไปสู่วงโคจรสูงสุดของพลูโตซึ่งอาจมาจากแผ่นงาน Excel นี้ดังนั้นฉันจะทำเช่นนั้น
นั่นทำให้ขอบเขตของระบบสุริยะอยู่ที่:
7,376,000,000 km = 7.376x10 ^ 9 km = 7.376x10 ^ 14 cm ≈ 7.4x10 ^ 14 cm
แม่นยำสองจุดลอยตัวรูปแบบข้อเสนอความแม่นยำสูงสุด 15 ทศนิยมอย่างมีนัยสำคัญ ดังนั้นคุณโชคดี: ถ้าต้นกำเนิดของคุณอยู่ที่ศูนย์กลางของดวงอาทิตย์และคุณใช้ตำแหน่งรอบพลูโตคุณสามารถแทนค่าเซนติเมตรทั้งหมดเช่นใน C ++:
printf("%.0Lf\n", 7.4e14);
printf("%.0Lf\n", 7.4e14 + 1.0);
printf("%.0Lf\n", 7.4e14 + 2.0);
Output:
-------
740000000000000
740000000000001
740000000000002
ดังนั้นหากคุณสามารถ จำกัด เกมของคุณให้อยู่ในวงโคจรของพลูโตได้แล้วขอแสดงความยินดีด้วย! คุณมีความแม่นยำเพียงพอที่จะเป็นตัวแทนของมัน
ระวังให้ดีนั่นก็เพียงพอแล้วที่จะแสดงมันในแบบจำลองแต่อย่าคาดหวังว่าจะทำให้สิ่งนี้เจ็บปวด คุณจะต้องแปลงเป็น 32 บิตลอยอาจเปลี่ยนแหล่งกำเนิดของคุณเพื่อให้คุณมีความแม่นยำเพียงพอในวัตถุใกล้และคุณอาจต้องพึ่งพา Z- บัฟเฟอร์และกลอุบาย frustum กล้องบางอย่างเพื่อให้สิ่งนี้แสดงอย่างถูกต้อง .
ทีนี้ถ้าคุณอยากให้นักบินอวกาศไปเยี่ยมดาวหางที่อยู่ไกลออกไปในเมฆออร์ตซึ่งใหญ่กว่านั้นมันก็จบแล้ว ประมาณ 10 ^ 16 ซม. คุณจะเริ่มต้นความแม่นยำ:
printf("%.0Lf\n", 1.0e16);
printf("%.0Lf\n", 1.0e16 + 1.0);
printf("%.0Lf\n", 1.0e16 + 2.0);
Output:
-------
10000000000000000
10000000000000000 <-- oops
10000000000000002
และมันก็ยิ่งแย่ลงไปอีกแน่นอน
ดังนั้นหากคุณอยู่ในกรณีนี้คุณอาจต้องการลองใช้โซลูชันขั้นสูงเพิ่มเติม ฉันขอแนะนำให้คุณดูที่บทความของ Peter Freeze ในGame Programming Gems 4: "2.3 การแก้ปัญหาความแม่นยำในพิกัดโลกขนาดใหญ่" IIRC เขาแนะนำให้ใช้ระบบที่เหมาะกับความต้องการของคุณจริง ๆ แล้วมันเป็นช่องว่างที่แตกต่างกันหลายแบบ
นั่นเป็นเพียงคำแนะนำบางอย่างคุณอาจต้องใช้สูตรอาหารของคุณเองเพื่อให้ได้ผล บางคนที่ใช้สิ่งนั้นไปแล้วอาจช่วยคุณได้มากกว่านี้ ทำไมไม่ลองส่งอีเมลถึงพวกที่อยู่เบื้องหลังโครงการ Kerbal Space Programล่ะ?
ขอให้โชคดีกับเกมของคุณ!