ในการจัดการตัวเลขทศนิยมในลักษณะที่กำหนด
จุดลอยตัวเป็นตัวกำหนด ก็ควรจะเป็น มันซับซ้อน.
มีวรรณกรรมมากมายเกี่ยวกับตัวเลขจุดลอยตัว:
และพวกเขามีปัญหาอย่างไร:
สำหรับนามธรรม อย่างน้อยในเธรดเดียวการดำเนินการเดียวกันกับข้อมูลเดียวกันที่เกิดขึ้นในลำดับเดียวกันควรถูกกำหนดไว้ ดังนั้นเราสามารถเริ่มต้นด้วยการกังวลเกี่ยวกับอินพุตและการจัดเรียงใหม่
อินพุตหนึ่งที่ทำให้เกิดปัญหาคือเวลา
ก่อนอื่นคุณควรคำนวณการประทับเวลาเดียวกันเสมอ ฉันไม่ได้บอกว่าไม่ได้วัดเวลาฉันกำลังบอกว่าคุณจะไม่ผ่านเวลาไปสู่การจำลองทางฟิสิกส์เพราะการแปรผันของเวลาเป็นที่มาของเสียงในการจำลอง
ทำไมคุณถึงวัดเวลาถ้าคุณไม่ผ่านการจำลองทางฟิสิกส์? คุณต้องการวัดเวลาที่ใช้ในการรู้ว่าเมื่อใดควรทำการเรียกขั้นตอนการจำลองและสมมติว่าคุณกำลังใช้โหมดสลีป
ดังนั้น:
- วัดเวลา: ใช่
- ใช้เวลาในการจำลอง: ไม่
ตอนนี้สั่งการเรียนการสอนใหม่
คอมไพเลอร์สามารถตัดสินใจได้ว่าf * a + b
เหมือนกันb + f * a
อย่างไรก็ตามอาจมีผลลัพธ์ที่แตกต่างกัน มันสามารถคอมไพล์เป็นfmaddหรืออาจตัดสินใจว่าจะใช้หลายบรรทัดเช่นนั้นเกิดขึ้นพร้อมกันและเขียนมันด้วยSIMDหรือการเพิ่มประสิทธิภาพอื่น ๆ ที่ฉันไม่สามารถคิดได้ในขณะนี้ และจำไว้ว่าเราต้องการให้การดำเนินการเดียวกันเกิดขึ้นตามลำดับเดียวกันด้วยเหตุผลที่เราต้องการควบคุมการดำเนินการที่เกิดขึ้น
และไม่การใช้ double จะไม่ช่วยคุณ
คุณต้องกังวลเกี่ยวกับคอมไพเลอร์และการกำหนดค่าโดยเฉพาะอย่างยิ่งในการซิงโครไนซ์หมายเลขจุดลอยตัวในเครือข่าย คุณต้องได้รับบิลด์เพื่อยอมรับการทำสิ่งเดียวกัน
เนื้อหาการเขียนการชุมนุมจะเหมาะ ด้วยวิธีนี้คุณจะตัดสินใจว่าจะทำอะไร อย่างไรก็ตามนั่นอาจเป็นปัญหาสำหรับการรองรับหลายแพลตฟอร์ม
ดังนั้น:
- เอิร์น ... อืม ... ใช้คอมไพเลอร์ที่ช่วยให้คุณกำหนดค่าวิธีที่พวกเขาจัดการกับจำนวนจุดลอย ยกตัวอย่างเช่นเห็น/ FP
(ระบุพฤติกรรมจุดลอยตัว)
กรณีสำหรับหมายเลขจุดคงที่
เนื่องจากวิธีการลอยแสดงในหน่วยความจำค่าขนาดใหญ่จะสูญเสียความแม่นยำ มันมาพร้อมกับเหตุผลที่ทำให้ค่าของคุณเล็ก (ตัวหนีบ) ช่วยลดปัญหา ดังนั้นไม่มีความเร็วสูงและไม่มีห้องพักขนาดใหญ่ ซึ่งหมายความว่าคุณสามารถใช้ฟิสิกส์แบบแยกเนื่องจากคุณมีความเสี่ยงในการขุดอุโมงค์น้อยกว่า
ในทางกลับกันข้อผิดพลาดเล็ก ๆ จะสะสม ดังนั้นตัดทอน ฉันหมายถึงปรับขนาดและส่งไปยังประเภทจำนวนเต็ม วิธีนี้ทำให้คุณรู้ว่าไม่มีสิ่งใดสร้างขึ้น จะมีการดำเนินการที่คุณสามารถทำได้โดยใช้ชนิดจำนวนเต็ม เมื่อคุณต้องการกลับไปยังจุดลอยตัวคุณจะทำการปลดและเลิกทำการปรับสเกล
หมายเหตุฉันพูดขนาด แนวคิดคือว่า 1 หน่วยจะถูกแสดงเป็นพลังของสอง (ตัวอย่างเช่น 16384) ให้ใช้ค่าคงที่และใช้มัน โดยทั่วไปคุณใช้มันเป็นหมายเลขจุดคงที่ ในความเป็นจริงถ้าคุณสามารถใช้หมายเลขจุดคงที่ที่เหมาะสมจากห้องสมุดที่เชื่อถือได้ดีกว่ามาก
ฉันกำลังพูดว่าตัดทอน เกี่ยวกับปัญหาการปัดเศษหมายความว่าคุณไม่สามารถไว้วางใจบิตสุดท้ายของค่าใด ๆ ที่คุณได้รับหลังจากการโยน ดังนั้นก่อนระดับสเกลที่จะได้รับมากกว่าที่คุณต้องการหนึ่งบิตและตัดทอนมันในภายหลัง
ดังนั้น:
- เก็บค่าเล็ก: ใช่
- การปัดเศษอย่างระมัดระวัง: ใช่
- กำหนดหมายเลขจุดคงที่เมื่อทำได้: ใช่
รอทำไมคุณต้องมีจุดลอยตัว? คุณไม่สามารถทำงานกับประเภทจำนวนเต็มเท่านั้นได้หรือไม่ โอ้ใช่. ตรีโกณมิติและการแผ่รังสี คุณสามารถคำนวณตารางสำหรับตรีโกณมิติและการแผ่รังสีและอบในแหล่งที่มาของคุณ หรือคุณสามารถใช้อัลกอริทึมที่ใช้ในการคำนวณด้วยหมายเลขจุดลอยตัวยกเว้นการใช้หมายเลขจุดคงที่แทน ใช่คุณต้องสร้างสมดุลของหน่วยความจำประสิทธิภาพและความแม่นยำ แต่คุณสามารถอยู่ห่างจากตัวเลขจุดลอยตัวและควบคุมได้
คุณรู้หรือไม่ว่าพวกเขาทำสิ่งเช่นนั้นสำหรับ PlayStation ดั้งเดิม? กรุณาพบสุนัขของฉัน, แพทช์
โดยวิธีการที่ฉันไม่ได้บอกว่าจะไม่ใช้จุดลอยสำหรับกราฟิก สำหรับวิชาฟิสิกส์เท่านั้น ฉันหมายความว่าแน่นอนตำแหน่งจะขึ้นอยู่กับฟิสิกส์ อย่างไรก็ตามอย่างที่คุณทราบ collider ไม่จำเป็นต้องตรงกับโมเดล เราไม่ต้องการเห็นผลลัพธ์ของการตัดทอนแบบจำลอง
ดังนั้น: ใช้จุดคงที่ตัวเลข
เพื่อความชัดเจนหากคุณสามารถใช้คอมไพเลอร์ที่ช่วยให้คุณระบุวิธีการทำงานของคะแนนลอยตัวและนั่นก็เพียงพอแล้วสำหรับคุณคุณสามารถทำได้ นั่นไม่ใช่ตัวเลือกเสมอไป นอกจากนี้เรากำลังทำเช่นนี้เพื่อกำหนด หมายเลขจุดคงที่ไม่ได้หมายความว่าไม่มีข้อผิดพลาดหลังจากทั้งหมดมีความแม่นยำ จำกัด
ฉันไม่คิดว่า "หมายเลขจุดตายตัวยาก" เป็นเหตุผลที่ดีที่จะไม่ใช้ และถ้าคุณต้องการเหตุผลที่ดีที่จะใช้มันมันก็เป็นดีเทอร์มิซึมโดยเฉพาะในหลาย ๆ แพลตฟอร์ม
ดูสิ่งนี้ด้วย:
ภาคผนวก : ฉันแนะนำให้รักษาขนาดของโลกให้เล็ก ด้วยที่กล่าวว่าทั้ง OP และ Jibb Smart นำมาซึ่งจุดที่เคลื่อนที่ห่างจากจุดกำเนิดดั้งเดิมนั้นมีความแม่นยำน้อยกว่า นั่นจะมีผลต่อฟิสิกส์หนึ่งอันที่จะเห็นได้เร็วกว่าขอบโลก หมายเลขจุดคงที่ดีมีความแม่นยำคงที่พวกเขาจะดีเท่า ๆ กัน (หรือไม่ดีถ้าคุณต้องการ) ทุกที่ ซึ่งจะดีถ้าเราต้องการระดับ ฉันยังต้องการพูดถึงว่าวิธีที่เราทำฟิสิกส์มักจะมีคุณสมบัติในการขยายรูปแบบขนาดเล็ก ดูผีเสื้อผล - ตายตัวฟิสิกส์ใน The Incredible เครื่องจักรและ contraption ชง
อีกวิธีในการทำฟิสิกส์
ฉันเคยคิดว่าสาเหตุที่ข้อผิดพลาดเล็ก ๆ ในความแม่นยำในการเพิ่มจำนวนจุดลอยตัวเป็นเพราะเรากำลังทำซ้ำกับตัวเลขเหล่านั้น แต่ละขั้นตอนการจำลองเรานำผลลัพธ์ของขั้นตอนการจำลองล่าสุดและทำสิ่งต่างๆ การสะสมข้อผิดพลาดบนข้อผิดพลาด นั่นคือผลกระทบผีเสื้อของคุณ
ฉันไม่คิดว่าเราจะเห็นบิลด์เดียวโดยใช้เธรดเดี่ยวบนเครื่องเดียวกันให้ผลลัพธ์ที่ต่างกันโดยอินพุตเดียวกัน แต่ในอีกเครื่องหนึ่งอาจทำได้
มีข้อโต้แย้งสำหรับการทดสอบที่นั่น หากเราตัดสินใจอย่างถูกต้องว่าสิ่งต่าง ๆ จะทำงานอย่างไรและเราสามารถทดสอบฮาร์ดแวร์เป้าหมายได้เราไม่ควรวางโครงสร้างที่มีพฤติกรรมแตกต่างกัน
อย่างไรก็ตามยังมีข้อโต้แย้งว่าไม่ได้ทำงานในที่ที่สะสมข้อผิดพลาดมากมาย บางทีนี่อาจเป็นโอกาสในการทำฟิสิกส์ในวิธีที่ต่างออกไป
ดังที่คุณอาจทราบว่ามีฟิสิกส์แบบต่อเนื่องและไม่ต่อเนื่องทั้งคู่ทำงานกับวัตถุแต่ละชิ้นที่จะเลื่อนไปตามเวลาที่กำหนด อย่างไรก็ตามฟิสิกส์แบบต่อเนื่องมีวิธีการในการค้นหาการชนกันของข้อมูลแทนการตรวจสอบการติดตั้งอินสแตนซ์ที่แตกต่างกันเพื่อดูว่าเกิดการชนกันหรือไม่
ดังนั้นฉันขอเสนอสิ่งต่อไปนี้: ใช้เทคนิคของฟิสิกส์แบบต่อเนื่องเพื่อหาว่าการชนกันครั้งต่อไปของวัตถุแต่ละชิ้นจะเกิดขึ้นด้วยการจับเวลาขนาดใหญ่มากเท่าขั้นตอนการจำลองเพียงครั้งเดียว จากนั้นคุณใช้การชนกันของข้อมูลที่ใกล้ที่สุดและหาว่าทุกอย่างจะเกิดขึ้นที่ใดในทันที
ใช่นั่นเป็นงานจำนวนมากของขั้นตอนการจำลองเดียว นั่นหมายความว่าการจำลองจะไม่เริ่มต้นทันที ...
... อย่างไรก็ตามคุณสามารถจำลองขั้นตอนการจำลองต่อไปได้โดยไม่ตรวจสอบการชนกันในแต่ละครั้งเพราะคุณรู้แล้วว่าการชนครั้งต่อไปจะเกิดขึ้นเมื่อใด (หรือว่าไม่มีการชนกันในการจับเวลาขนาดใหญ่) นอกจากนี้ข้อผิดพลาดที่สะสมในการจำลองนั้นไม่เกี่ยวข้องเพราะเมื่อการจำลองมาถึงการประทับเวลาจำนวนมากเราเพิ่งวางตำแหน่งที่เราคำนวณไว้ล่วงหน้า
ตอนนี้เราสามารถใช้งบประมาณเวลาที่เราเคยใช้ในการตรวจสอบการชนกันของแต่ละขั้นตอนการจำลองเพื่อคำนวณการชนกันครั้งต่อไปหลังจากที่เราพบ นั่นคือเราสามารถจำลองล่วงหน้าโดยใช้การประทับเวลาขนาดใหญ่ สมมติว่าโลกมีขอบเขต จำกัด (สิ่งนี้จะไม่ได้ผลสำหรับเกมใหญ่) ควรมีคิวของสถานะในอนาคตสำหรับการจำลองและจากนั้นแต่ละเฟรมที่คุณเพิ่งสอดแทรกจากสถานะสุดท้ายไปยังเฟรมถัดไป
ฉันจะโต้แย้งการแก้ไข อย่างไรก็ตามเนื่องจากมีการเร่งความเร็วเราไม่สามารถแก้ไขทุกอย่างด้วยวิธีเดียวกันได้ แต่เราจำเป็นต้องแก้ไขโดยคำนึงถึงความเร่งของแต่ละวัตถุ สำหรับเรื่องนั้นเราสามารถอัปเดตตำแหน่งในลักษณะเดียวกับที่เราทำกับการจับเวลาขนาดใหญ่ (ซึ่งก็หมายความว่ามันจะเกิดข้อผิดพลาดได้น้อยลงเพราะเราจะไม่ใช้สองแอพพลิเคชั่นที่แตกต่างกันสำหรับการเคลื่อนไหวเดียวกัน)
หมายเหตุ : หากเรากำลังทำตัวเลขทศนิยมนี้วิธีการนี้จะไม่แก้ปัญหาของวัตถุที่มีพฤติกรรมแตกต่างไปจากแหล่งกำเนิด อย่างไรก็ตามในขณะที่มันเป็นความจริงที่ความแม่นยำหายไปไกลกว่าที่คุณไปจากแหล่งกำเนิดที่ยังคงกำหนด ในความเป็นจริงนั่นคือเหตุผลที่ไม่ได้นำมาซึ่งเดิม
ภาคผนวก
จาก OP ในความคิดเห็น :
แนวคิดคือผู้เล่นจะสามารถบันทึกเครื่องจักรในบางรูปแบบ (เช่น xml หรือ json) เพื่อให้บันทึกตำแหน่งและการหมุนของแต่ละชิ้น ไฟล์ xml หรือ json นั้นจะถูกใช้เพื่อทำซ้ำเครื่องในคอมพิวเตอร์ของผู้เล่นอื่น
ดังนั้นไม่มีรูปแบบไบนารีใช่มั้ย นั่นหมายความว่าเราจำเป็นต้องกังวลว่าตัวเลขจุดลอยตัวที่กู้คืนมานั้นตรงกับต้นฉบับหรือไม่ ดู: ความแม่นยำของโฟลตมาถึง: การพกพาโฟลตแบบเก้าหลัก