ฉันยังจำเป็นต้องใช้จุดคงที่เพื่อรับประกันว่าคอมพิวเตอร์จะได้ผลลัพธ์เหมือนกันสำหรับการดำเนินการทางคณิตศาสตร์อีกต่อไปหรือไม่?


9

ฉันบอกคอมพิวเตอร์ที่ทันสมัยที่สุดว่าเป็นไปตามมาตรฐานจุดลอยตัวเดียวกันหมายความว่าพวกเขาทุกคนจะได้รับคำตอบเดียวกันสำหรับการดำเนินการทางคณิตศาสตร์ที่กำหนดหากอินพุตเหมือนกันหรือไม่?

ฉันถามเพราะฉันกำลังค้นคว้าหาข้อมูลเกี่ยวกับการสร้างเกม RTS บนเครือข่ายและการซิงค์ตำแหน่งของยูนิตนับร้อยดูเหมือนจะเป็นวิธีที่ไม่ดี

ดังนั้นถ้าฉันส่งเฉพาะอินพุตเท่านั้นฉันต้องรับประกันว่าลูกค้าทั้งหมดจะได้รับผลลัพธ์เดียวกันโดยให้พวกเขาเรียกใช้การจำลองจากอินพุตเหล่านั้น

ฉันอ่านว่าเกม RTS ที่เก่ากว่าใช้การคำนวณจุดคงที่ แต่ฉันไม่รู้ว่ายังคงต้องใช้กับคอมพิวเตอร์ที่ทันสมัยหรือไม่หากพวกเขาปฏิบัติตามมาตรฐานเดียวกันหรือไม่ ฉันยังบอกด้วยว่าถึงแม้จะไม่แน่ชัด แต่ผลลัพธ์ของจุดลอยตัวนั้นถูกกำหนดไว้สำหรับอินพุตเดียวกัน

คอมพิวเตอร์ยังคงมีการเบี่ยงเบนแม้ว่าพวกเขาจะเป็นไปตามมาตรฐานจุดลอยตัวเดียวกันหรือไม่?

ฉันกำลังเขียนเกมนี้ใน C # ไม่แน่ใจว่าเรื่องนั้นคิดว่าฉันจะพูดถึงมันต่อไป


แม้ว่าพวกเขาจะทำเช่นนั้นฉันก็จะไม่ใช้ทุ่นเพื่อสิ่งนั้น
Telastyn

คุณหมายถึงอะไร ทำไมจะไม่ล่ะ?
WDUK

การใช้งานของลอยอาจไม่พึงประสงค์เนื่องจากพฤติกรรมอาจขึ้นอยู่กับตำแหน่งบนแผนที่ ดินแดนอันไกลโพ้นของ Minecraft นั้นเป็นตัวอย่างที่โดดเด่นยิ่งกว่า: การเคลื่อนไหวการเรนเดอร์และการสร้างภูมิประเทศจะได้รับความผิดพลาดเมื่อคุณเคลื่อนที่ห่างจากจุดเกิด
amon

คำตอบ:


18

คอมพิวเตอร์ยังคงมีการเบี่ยงเบนแม้ว่าพวกเขาจะเป็นไปตามมาตรฐานจุดลอยตัวเดียวกันหรือไม่?

น่าเสียดายใช่โดยเฉพาะอย่างยิ่งเมื่อคุณใช้ C # (หรือภาษาที่รวบรวม JIT อื่น) ปัญหาที่เกิดขึ้นที่นี่คือขั้นตอนการรวบรวม JIT ในสถาปัตยกรรมตัวประมวลผลบางตัวสร้างรหัสที่ใช้การลงทะเบียน CPU มากกว่าสถาปัตยกรรมอื่น ๆ สิ่งนี้สามารถนำไปสู่สถานการณ์ที่มีอยู่ในเครื่องบางเครื่องความแม่นยำจุดลอยตัวแบบขยายถูกนำมาใช้สำหรับการทำงานบางอย่าง ซึ่งหมายความว่าสำหรับการคำนวณซ้ำทุกครั้งโดยใช้สองเท่ามีโอกาสที่จะเกิดข้อผิดพลาดในการปัดเศษสะสมที่แตกต่างกัน

นั่นไม่ใช่ปัญหาสมมุติฐานฉันมีประสบการณ์โดยตรงกับการเบี่ยงเบนดังกล่าวในซอฟต์แวร์การจำลองทางวิศวกรรมร่วมสมัยบนฮาร์ดแวร์ที่ทันสมัยมากขึ้นหรือน้อยลง ปัญหานี้ทำให้ยากมากในการสร้างการทดสอบการถดถอยที่เชื่อถือได้สำหรับการคำนวณจุดลอยตัวที่ซับซ้อนซึ่งให้ผลลัพธ์ที่เหมือนกันทุกเครื่องที่เกี่ยวข้อง


นี้. สาเหตุบางประการ: IEEE Std 754 มีคำสั่ง "ควร" (เช่นการจัดการ NaN) ซึ่งเป็นทางเลือกและอนุญาตให้มีทางเลือกในการออกแบบ (เช่นการตรวจจับการไหลล้น) ในส่วนที่เกี่ยวกับการผูกภาษาสนับสนุนมาตรฐานจุดลอยตัวพวกเขาอาจยังคงให้ความสำคัญกับคอมไพเลอร์เมื่อประเมินนิพจน์จุดลอยตัวเช่นFLT_EVAL_METHODใน ISO C / C ++ ฟังก์ชั่นยอดเยี่ยม (เช่นsin, exp, log) เป็นส่วนใหญ่อลหม่านโดยทั้งสองมาตรฐานจุดลอยตัว IEEE และการเขียนโปรแกรมภาษามาตรฐาน การอัปเกรดเวอร์ชันไลบรารีอย่างง่าย (เช่นglibcเวอร์ชันใหม่) อาจทำให้ผลลัพธ์ต่างกัน
njuffa

ฉันตีมันเองในเกม จรวดบินไปได้ดีบนแล็ปท็อปของฉันจะไม่บินบนเดสก์ท็อปของฉันการติดตั้งที่เหมือนกันอย่างสมบูรณ์
Loren Pechtel

3

ข้อผิดพลาดของ Floating Point

หมายเลขจุดลอยตัวทุกตัวจะมีค่าไม่ถูกต้องตามที่ใช้ในการคำนวณ นี่คือความจริงที่เรียบง่ายของการใช้รูปแบบที่แน่ชัดในการคำนวณในการคำนวณนี้ยังมีความอ่อนไหวต่อคำสั่งของการคำนวณ commutativity ไม่รับประกันเช่น:. อาจจะหรืออาจจะไม่เหมือนกัน(a + b) + ca + (b + c)

นอกจากนี้โปรเซสเซอร์ไม่จำเป็นต้องมีความยาว mantissa เท่ากับมาตรฐานหน่วยความจำ สิ่งนี้สามารถสร้างพฤติกรรมที่น่าสนใจในขณะที่ 32/64/128 บิตทุ่นลอยทำงานเป็นบางครั้งราวกับว่าพวกเขามีบิตมากขึ้น

ข้อผิดพลาดคงที่

ที่ถูกกล่าวว่าเลขคณิตจุดคงที่ยังสามารถสะสมข้อผิดพลาด ความแตกต่างคือหมายเลขจุดคงที่ชัดเจนเกี่ยวกับความแม่นยำที่หายไปและขึ้นอยู่กับการดำเนินการที่เลือกสามารถหลีกเลี่ยงข้อผิดพลาดในการปัดเศษทั้งหมด (a + b) + c = a + (b + c)พวกเขายังมีการสับเปลี่ยน

ที่?

ตัวเลือกใดที่จะใช้ขึ้นอยู่กับคุณสมบัติที่คุณต้องการ

หมายเลขจุดลอยตัว:

  • ให้คุณค่าที่หลากหลายซึ่งมีความละเอียดมากและใกล้เคียงกันมากขึ้นเรื่อย ๆ
  • มีความอ่อนไหวต่อลำดับการคำนวณ
  • สะสมข้อผิดพลาดในการปัดเศษเมื่อเวลาผ่านไป
  • สามารถมีพฤติกรรมที่ผิดปกติเนื่องจากฮาร์ดแวร์ / หน่วยความจำขนาดลอยไม่ตรงกัน

หมายเลขจุดคงที่:

  • ให้ช่วงตัวเลขที่เล็กลงด้วยระยะห่างเท่ากันระหว่างสองหมายเลขติดต่อกัน
  • มีความไวต่อลำดับการคำนวณน้อยกว่า
  • ชัดเจนเกี่ยวกับข้อผิดพลาดในการปัดเศษ
  • สามารถทำงานร่วมกับเพื่อลด / หลีกเลี่ยงปัญหาการปัดเศษ

1
"หมายเลขจุดคงที่มีความชัดเจนเกี่ยวกับความแม่นยำที่หายไป" - จุดลอยตัวก็ชัดเจนเช่นกันความแตกต่างค่อนข้างคงที่ของจุดที่ไม่ถูกต้องนั้นง่ายกว่าสำหรับการนับเลขทั่วไป
whatsisname

1
ดังนั้นจุดคงที่เท่านั้นรับประกันคอมพิวเตอร์ทุกเครื่องโดยไม่คำนึงถึงฮาร์ดแวร์ ฯลฯ จะพบข้อผิดพลาด / การสูญเสียความแม่นยำเดียวกัน?
WDUK

1
เป็นหลักใช่เพราะคุณสามารถระบุว่าหมายเลขจุดคงที่ของคุณเป็น 32 หรือ 64 บิตและพวกเขาจะอยู่ในทุกระบบ ตัวเลขจุดลอยตัวอาจเป็น 32 หรือ 64 บิต แต่ฮาร์ดแวร์อาจใช้ 48 หรือ 96 บิตเพื่อทำการคำนวณและแปลงเป็น 32 หรือ 64 บิตในตอนท้ายทำให้เกิดความแตกต่างระหว่างฮาร์ดแวร์ประเภทต่างๆ
user1118321

@whatsisname (a + b * c) / d - eในขณะที่รายละเอียดจุดลอยมีความชัดเจนมากคุณจะไม่สามารถได้อย่างง่ายดายบอกฉันว่าปัญหาการปัดเศษฉันจะพบในจำนวนนี้: ยกเว้นปัญหาที่เห็นได้ชัดเช่นการNaNหารด้วยศูนย์หรือมากเกินไป / อันเดอร์โฟลว์มันเป็นไปได้ที่การแสดงออกนี้จะไม่ถูกต้อง เพิ่มไปที่ความต้านทานระหว่างหน่วยความจำและลงทะเบียนในแง่ของความแม่นยำและแม้กระทั่งการโหลด / เก็บง่าย ๆ จากหน่วยความจำของค่าจุดลอย "เดียวกัน" จะเปลี่ยนคำตอบ
Kain0_0

@ Kain0_0: ถูกต้องฉันไม่สามารถบอกสิ่งที่ฉันจะพบได้อย่างง่ายดายเพราะฉันไม่ใช่ผู้เชี่ยวชาญเรื่องจุดลอยตัว นั่นคือสิ่งที่มีความหมายเมื่อฉันพูดว่า "ใช้งานง่ายกว่าการนับจำนวนชีวิตปกติ" เมื่อคุณพูดว่าจุดคงที่คือ "ชัดเจน" และไม่ใช่จุดลอยตัวคุณจะได้ยินเสียงราวกับว่าการลอยตัวนั้นดูเหมือนจะไม่ถูกต้องแบบสุ่ม
whatsisname

-1

มีคำถามว่าทำไมคุณต้องการที่จะรับประกันผลเหมือนกันคือตั้งแต่ผลเหมือนกันให้การรับประกันใดที่ทุกคนว่าผลของคุณมีประโยชน์

คุณอาจมีอัลกอริธึมที่ไม่เสถียรเชิงตัวเลขที่ให้ผลลัพธ์ที่เหมือนกัน แต่ไร้สาระอย่างสมบูรณ์ในคอมพิวเตอร์ที่แตกต่างกันสองชุด หากมีความแตกต่าง แต่ผลลัพธ์เหมือนกันภายใน 13 หลักนั่นน่าเชื่อถือกว่ามาก

มีสถานการณ์น้อยมากที่ความสำคัญในการทำซ้ำมีความสำคัญจริง ๆ : ในเลย์เอาต์เอ็นจิ้นหรือการบีบอัด / คลายการบีบอัดแบบไม่สูญเสียข้อมูล การใช้จุดคงที่มีแนวโน้มที่จะเข้าใจผิดมาก


ฉันไม่ได้ลงคะแนนคำตอบของคุณ แต่ดูเหมือนว่ากรณีที่อธิบายโดย OP เป็น "หนึ่งในไม่กี่สถานการณ์ที่การทำซ้ำมีความสำคัญจริงๆ" ในเกม RTS ข้อผิดพลาดในการปัดเศษขนาดเล็กสามารถสร้างความแตกต่างระหว่าง "วัตถุสองชิ้นชนกัน" ได้หรือไม่
Doc Brown
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.