ความแม่นยำโดยนัยของฟังก์ชันเลขทศนิยม


9

ในขณะที่ตรวจสอบการใช้งานฟังก์ชั่นของโปรแกรมเมอร์อื่นเพื่อคำนวณ CDF การแจกแจงแบบปกติฉันได้แนะนำให้แทนที่การใช้งานทั้งหมดด้วยฟังก์ชันในตัวของ Python หรือใช้ SciPy ซึ่งเป็นห้องสมุดวิทยาศาสตร์ทั่วไป

โปรแกรมเมอร์อีกชี้ให้เห็นว่าค่าmath.erfc()มิได้scipy.stats.norm.cdf()ให้การค้ำประกันความแม่นยำใด ๆ ในเอกสารของพวกเขา ดังนั้นฉันจึงควรระมัดระวังเกี่ยวกับการเปลี่ยนอัลกอริทึมการประมาณ (ซึ่งนำมาจากแหล่งที่ได้รับการเคารพและมีขอบเขตข้อผิดพลาดที่เป็นเอกสาร )

ความจริงแล้วความคิดที่จะสงสัยความถูกต้องและแม่นยำของฟังก์ชั่นในตัวหรือห้องสมุดไม่เคยข้ามความคิดของฉัน หลังจากที่ทุกคนฉันได้รับการเรียกฟังก์ชั่นเหมือนsin()และsqrt()สำหรับปีโดยไม่ต้องคิดมาก - เหตุผลที่ควรmath.erf()หรือscipy.stats.norm.cdf()จะแตกต่างกันหรือไม่?

แต่ตอนนี้ฉันกังวล คำถามของฉันคือ:

  1. โดยทั่วไปหากเอกสารไม่มีการกล่าวถึงเป็นพิเศษแสดงว่าฟังก์ชั่นเหล่านี้มีความถูกต้องสมบูรณ์ในตำแหน่งทศนิยมสุดท้ายภายในความแม่นยำที่นำเสนอโดยทศนิยมความแม่นยำสองเท่าของ IEEE หรือไม่?
  2. นั่นเป็นเรื่องจริงสำหรับ Python math.erf()หรือ SciPy scipy.stats.norm.cdf()หรือไม่? คุณจะบอกได้อย่างไร
  3. นี้หน้าคนสำหรับsin()กล่าวว่า ...

    ฟังก์ชั่นเหล่านี้อาจสูญเสียความแม่นยำเมื่อข้อโต้แย้งของพวกเขาอยู่ใกล้กับหลาย pi หรืออยู่ห่างจาก 0.0

    ทำไมคำเตือนควรมีอยู่เมื่อฟังก์ชันไซน์เป็นคาบและสมมาตร ดูเหมือนว่าจะมีภาระที่ผู้เรียกเข้ารับการป้อนข้อมูลเป็นมาตรฐานเพื่อให้ได้ความแม่นยำสูงสุด

    ในทางตรงกันข้ามเอกสารของ Mozilla สำหรับMath.sin()บอกว่าไม่มีอะไรเกี่ยวกับความถูกต้องหรือความแม่นยำ นั่นหมายความว่ามันถูกต้องสมบูรณ์หรือเป็น "ความรู้ทั่วไป" ที่Math.sin()จะแม่นยำในบางสถานการณ์ใน JavaScript เช่นที่อื่นหรือไม่


1
FYI เกี่ยวกับคำถามที่ 1: โดยปกติแล้วการรับรองความแม่นยำจะได้รับในรูปแบบของ ULP (หน่วยในตำแหน่งสุดท้าย) ซึ่งอ้างถึงตัวเลขฐานสองของการลอย

คำตอบ:


10

หากเอกสารไม่มีการกล่าวถึงเป็นพิเศษแสดงว่าฟังก์ชั่นเหล่านี้มีความถูกต้องสมบูรณ์ในตำแหน่งทศนิยมสุดท้ายภายในความแม่นยำที่นำเสนอโดย IEEE ทศนิยมสองตำแหน่งที่แม่นยำ?

ฉันจะไม่ทำเรื่องนั้น

ฉันทำงานที่ไหนเราจัดการกับข้อมูล telemetry และเป็นความรู้ทั่วไปที่ห้องสมุดคณิตศาสตร์ที่แตกต่างกันสองแห่งสามารถให้ผลลัพธ์ที่แตกต่างกันสองรายการแม้ว่าพวกเขาทั้งสองจะสอดคล้องกับมาตรฐาน IEEE floating point สิ่งนี้มีความหมายเมื่อคุณพยายามทำการคำนวณซ้ำและเปรียบเทียบผลลัพธ์สองรายการเพื่อความเท่าเทียมกัน

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

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

ในทางตรงกันข้ามเอกสารของ Mozilla ...

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


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