เหตุใดความแม่นยำของโมดูลัสจุดลอยตัวจึงมีความสำคัญ


9

ภาษาถิ่น Smalltalk ส่วนใหญ่ใช้โมดูลัสลอยตัวแบบไร้เดียงสาที่ไร้เดียงสา (fmod / เศษที่เหลือ)
ฉันเพิ่งเปลี่ยนสิ่งนี้เพื่อปรับปรุง Squeak / Pharo และท้ายที่สุดการยึดติดกับ Smalltalk อื่น ๆ ตามมาตรฐาน (IEEE 754, ISO / IEC 10967) ตามที่ฉันได้ทำไปแล้วสำหรับการดำเนินการจุดลอยตัวอื่น ๆ

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

มีใครที่นี่รู้หรือไม่ว่าทำไม / เมื่อ / ที่ไหน (IOW ซึ่งอัลกอริทึมใด) ความแม่นยำของโมดูลัสนั้นจะสำคัญหรือไม่?


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

1
ฉันเคยเห็นรหัสที่ใช้ความถูกต้องของ fmod / modf ซึ่งทำให้ฉันสั่น แต่ความเป็นไปได้ที่ภาษาอาจกล้าใช้โมดูลัสจุดลอยตัวที่ไร้เดียงสาอย่างไม่น่าเชื่อดูเหมือนจะยิ่งน่ากลัวกว่า โค้ดตัวอย่าง: (1) จดส่วนที่เหลือ (2) หยุดถ้ามันเป็นศูนย์ (3) คูณด้วย 2 แล้วไปที่ (1) หนึ่งสามารถทำผลงานที่มีประโยชน์บางอย่างในระหว่างขั้นตอนนี้ แต่จุดสำคัญคือการสิ้นสุดของกระบวนการนี้ที่อาศัยความถูกต้องของที่เหลือและความถูกต้องของการคูณโดย 2. ไม่แน่ใจว่าฉันควรจะให้คำตอบที่สมบูรณ์มากขึ้นที่นี่เพราะวิทยาศาสตร์ดูเหมือนว่าเหมาะสมมากขึ้น สำหรับคำถามนี้
Thomas Klimpel

หนึ่งเดา: normalizing อินพุตของฟังก์ชั่นตรีโกณมิติ
Paul A. Clayton

@ThomasKlimpel ฉันสนใจถ้าคุณค้นหาข้อมูลอ้างอิง โปรดทราบว่าส่วนที่เหลือไร้เดียงสาหมายถึง (x - ((y / x) ที่ถูกตัดทอน * x)) ด้วย IEEE รอบที่ใกล้ที่สุดแม้จะเป็น ops เราสามารถพิสูจน์ได้ว่า exactRem (x, y) == 0 => naiveRem (x, y) == 0 ปัญหาคือสิ่งที่ตรงกันข้าม - การแบ่งที่ถูกต้องเป็นบวก - เช่น naiveRem (4.0,0.1) == 0.0 ซึ่งน่าเสียดายที่ไร้เดียงสาในหลายกรณี!
aka.nice

@ PaulA.Clayton ใช่สำหรับไซน์เป็นองศาบางที ... แม้ว่าการเดาของฉันคือ rem ที่ไร้เดียงสาทำงานได้ดีพอ ๆ กับ rem ที่แน่นอนจนถึงประมาณ 1e16 องศาเนื่องจาก 360 มีช่วงของการตั้งค่าเพียง 6 บิตและเนื่องจากการหารด้วย 360 ดูเหมือนว่าจะไม่ปัดเศษขึ้นสำหรับรุ่นก่อนหน้าของหลาย ๆ 360 ... สำหรับเรเดียนห้องสมุดที่ดีต้องมีความแม่นยำหลายตัว ช่วยในกรณีเช่นนี้จริงเหรอ?
aka.nice

คำตอบ:


1

โปรดทราบว่าการใช้จุดลอยตัวที่ไม่แน่นอนนั้นส่งผลต่อสภาพอากาศ

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

กฎการปัดเศษในมาตรฐาน (IEEE 754, ISO / IEC 10967) ได้รับการพิจารณาอย่างรอบคอบเพื่อให้อัลกอริธึมเชิงตัวเลขสามารถคาดการณ์ได้อย่างแม่นยำและให้ผลลัพธ์ที่เหมือนกันทุกครั้ง หากไม่ปฏิบัติตามอัลกอริธึมเชิงตัวเลขมาตรฐานที่ออกแบบมาสำหรับกฎการปัดเศษจะทำให้เกิดปัญหาและอัลกอริธึมซ้ำ ๆ เช่นการพยากรณ์อากาศสามารถให้ผลลัพธ์แบบสุ่มได้

(และนั่นไม่ได้พูดอะไรเกี่ยวกับการพยากรณ์อากาศ :)


1
ในทางกลับกันหากเอฟเฟกต์ผีเสื้อเปลี่ยนแดดเป็นฝนผลลัพธ์ของคุณก็ไม่ได้มีประโยชน์
gnasher729

กาลครั้งหนึ่งฉันบันทึกข้อมูลลอยใน ASCII ด้วยตัวเลขไม่เพียงพอ ลูกค้ารายหนึ่งต้องการแสดงปัญหาให้ฉัน แต่หลังจากกู้คืนข้อมูลจากไฟล์ ASCII ปัญหาหายไป ฉันบอกว่าการปิดแผลเล็กน้อยไม่น่าจะสำคัญถ้าปัญหาของเขาไม่ดีไม่มีอะไรที่ฉันสามารถทำได้ เขาบอกว่ามันเป็นธุรกิจของเขาฉันต้องจัดหาซอฟต์แวร์ที่สามารถทำให้เกิดปัญหาซ้ำได้ เขาพูดถูก
aka.nice

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