การคำนวณ reals: floating point กับ TTE เทียบกับ domain domain vs etc


19

ปัจจุบันการคำนวณ reals ในภาษายอดนิยมส่วนใหญ่ยังดำเนินการผ่านการดำเนินการจุดลอยตัว ในทางตรงกันข้ามทฤษฎีเช่นประเภทสอง effectivity (TTE) และทฤษฎีโดเมนมีสัญญาการคำนวณ reals ที่แน่นอน เห็นได้ชัดว่าปัญหาของความแม่นยำจุดลอยตัวไม่ได้ลดลงในความเกี่ยวข้องดังนั้นทำไมทฤษฎีเหล่านี้ถึงไม่กลายเป็นกระแสหลักมากขึ้นและทำไมจึงไม่มีการใช้งานที่ชัดเจนมากขึ้นของพวกเขา

ตัวอย่างเช่นมีโดเมนของแอปพลิเคชันที่เราไม่สนใจมากเกี่ยวกับข้อผิดพลาดจุดลอยตัวหรือไม่ มีความกังวลที่ซับซ้อนอย่างมากหรือไม่?

คำตอบ:


17

ฉันทำงานในการคำนวณจำนวนจริงและฉันหวังว่าฉันจะรู้คำตอบที่แท้จริง แต่ฉันสามารถคาดเดาได้ ฉันคิดว่ามันเป็นปัญหาทางสังคมวิทยา

ชุมชนของคนที่ทำงานเกี่ยวกับเลขคณิตที่แท้จริงประกอบด้วยนักทฤษฎีที่ไม่ได้คุ้นเคยกับการพัฒนาซอฟต์แวร์ ดังนั้นพวกเขาจึงมักจะทิ้งงานของการดำเนินการให้กับนักเรียน (ยกเว้นที่น่าสังเกตคือ Norbert ของMüller iRRAM ) หรือพวกเขามีของตัวเองใช้งานของเล่น

คนที่ทำมีการเขียนโปรแกรมที่จำเป็นโมโจไม่ได้มีพื้นหลังทางทฤษฎีที่จำเป็น หากไม่มีฐานรากทางทฤษฎีที่มั่นคงจะเป็นการยากที่จะออกแบบทางคณิตศาสตร์จริงให้ถูกต้อง ตัวอย่างเช่นมันเป็นความผิดพลาดในการเพิ่มจำนวนจริงจำนวนมากในการforวนซ้ำเนื่องจากคุณจะได้รับการแสดงที่ไม่สามารถยอมรับได้เนื่องจากการสูญเสียความแม่นยำ หากคุณต้องการเพิ่มล็อตจำนวนมากและ reals คุณควรทำมันด้วยโครงสร้างเหมือนต้นไม้โดยคำนึงถึงขนาดของผลรวมบางส่วน อีกสิ่งที่ยากที่จะเข้าใจคือว่า<และ=เนื่องจากฟังก์ชันบูลีนรวมบน reals นั้นไม่มีอยู่จริง (คุณสามารถมีได้=แต่มันอาจส่งคืนfalseหรือกลับเป็น diverges และ<diverges เมื่อให้สอง reals เท่ากัน)

สุดท้ายมันไม่ชัดเจนเลยที่เรารู้วิธีการใช้ไลบรารี่สำหรับการคำนวณทางคณิตศาสตร์ที่แท้จริง พวกเขาไม่ใช่ไลบรารีปกติที่เพิ่งกำหนดประเภทข้อมูลและฟังก์ชั่นบางอย่างกับพวกเขา บ่อยครั้งที่การคำนวณทางคณิตศาสตร์ที่แท้จริงต้องการโหมดการควบคุมพิเศษ ตัวอย่างเช่น iRRAM เข้าควบคุมการดำเนินการหลักของโปรแกรม (มันคือ hijacks อย่างแท้จริงmain) รวมถึงอินพุตและเอาต์พุตมาตรฐานเพื่อให้สามารถรันโปรแกรมอีกครั้งเมื่อสูญเสียความแม่นยำเกิดขึ้น ห้องสมุดของฉันสำหรับเลขคณิตจริงใน Haskell เกิดขึ้นในStagedmonad (ซึ่งเป็นหลักReadermonad) คนส่วนใหญ่คาดว่าตัวเลขจริงจะเป็น "ประเภทข้อมูลอื่น" แต่ฉันมีข้อสงสัยเกี่ยวกับเรื่องนี้


ฉันเกือบจะจดจ่ออยู่กับเลขคณิตจริงทั้งหมด แต่ไม่มีใครใช้การรวม Kahan ในนั้นได้หรือ
jjg

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

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

1
ฉันเห็นว่ามีกิจกรรมบางอย่างในการนำการคำนวณที่แท้จริงมาใช้กับชนิดของการเรียงลำดับ ฉันรู้สึกว่าประเภทเหรียญยังค่อนข้างยุ่งยาก (ฉันไม่เชี่ยวชาญในเรื่องนี้) แต่คุณคิดว่านี่เป็นคำสัญญาสำหรับการใช้การคำนวณจริงที่แพร่หลายมากขึ้นหรือไม่?
SorcererofDM

3
การนำไปใช้งานใด ๆ ที่ใช้ลำธารของตัวเลขหรือสิ่งอื่นใดที่มีอัตราการลู่เข้าคงที่จะถูกพิการจากการเริ่มแรกซึ่งจะทำให้การบรรจบกันช้าเกินไป นอกจากนี้การใช้งานแบบสตรีมมักจะบังคับให้คุณคำนวณค่าประมาณก่อนหน้านี้ทั้งหมดเพื่อให้ได้ค่าถัดไปซึ่งเป็นความผิดพลาดในการออกแบบเช่นกัน
Andrej Bauer

10

โดยทั่วไปผู้คนมักจะใส่ใจกับข้อผิดพลาดของจุดลอย อย่างไรก็ตามฉันไม่เห็นด้วยกับ Andrej และฉันไม่คิดว่าการลอยตัวเป็นสิ่งที่ต้องการความแม่นยำตามอำเภอใจ (ส่วนใหญ่) เพราะเหตุผลทางสังคมวิทยา

ผมเชื่อว่าเหตุผลหลักกับการคำนวณที่แน่นอนของ reals เป็นหนึ่งในการปฏิบัติงาน ดังนั้นคำตอบสั้น ๆ คือเมื่อใดก็ตามที่ประสิทธิภาพการทำงานที่มีความสำคัญมากกว่าความแม่นยำคุณจะต้องการที่จะใช้ตัวเลขทศนิยม

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

โดยเฉพาะอย่างยิ่งปัญหาของการแสดงจำนวนจริงจำนวนมากโดยใช้จำนวนบิตคงที่นั้นไม่ได้เล็กน้อยอย่างที่มันอาจจะเห็นได้อย่างรวดเร็วก่อน ในการจำลองเชิงตัวเลขค่าอาจแตกต่างกันอย่างมาก (เช่นเมื่อมีความปั่นป่วน) ดังนั้นการคำนวณจุดคงที่จึงไม่เหมาะสม

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


1
มีช่องว่างใด ๆ ที่ได้รับการพิสูจน์แล้วระหว่างการคำนวณจริงบางรูปแบบและการคำนวณจุดลอยตัวบางรูปแบบ?
SorcererofDM

1
ไม่ใช่ที่ฉันรู้ฉันกลัว ฌอน Gao มีผลลัพธ์ที่น่าสนใจบางอย่างเกี่ยวกับความซับซ้อนของขั้นตอนการตัดสินใจโดยประมาณมากกว่า reals (ดูเขาวิทยานิพนธ์นามธรรม ) และแน่นอนในส่วนผกผันของเมทริกซ์เติบโตที่เลวร้ายที่สุดเหมือนปัจจัย
ดี้

-6

ฉันแทบจะไม่ชำนาญ แต่ฉันได้รับการสับของฉันเกี่ยวกับเรื่องนี้ในช่วงไม่กี่ปีที่ผ่านมา ปัญหาคือว่าตัวเลข "ของจริง" นั้นไม่มีอยู่ในลักษณะเดียวกับที่ตัวเลข natrual ทำ มีใครบ้างที่เข้าใจ " -ness" ที่เข้าใจได้ง่าย? โดยพื้นฐานแล้วจำนวนจริงจะถูกกำหนดโดยกระบวนการ จำกัด ต่างๆ กระบวนการ จำกัด จำนวนมากเหล่านี้ได้รับชื่อพิเศษและบางอย่างก็พิเศษพอที่จะสร้างชุดย่อยที่สำคัญของ reals (เช่นหมายเลขพีชคณิต)π

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

แน่นอนโปรแกรมเมอร์ที่ทำงานน้อยมากคิดแบบนี้ พวกเขาส่วนใหญ่พูดกับตัวเองว่า "Gee, double มีความแม่นยำมากกว่าที่ฉันเคยเป็นไปอาจจะใช้มันได้" และส่วนใหญ่เป็นวิธีที่ประหยัดที่สุด ปัญหาคือว่าโปรแกรมเมอร์ส่วนใหญ่ไม่ทราบวิธีการจุดเมื่อพวกเขาจะได้รับเป็นปัญหาเพราะชุดของความแม่นยำสองลอยเป็นอนันต์มีขนาดเล็กกว่า ...R

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.