March 16, 2012

Python: ใช้ทศนิยมแบบ decimal และ fractions

การจัดการเลขทศนิยมในคอมพิวเตอร์ส่วนมาก จะใช้ floating point แบบ IEEE 754 ทำให้ความแม่นยำในหลักท้ายๆ หายไปเสมอ เช่น



ทางแก้นอกจากจะปัดเศษตามข้างต้นแล้ว ยังมี decimal เมื่อต้องการค่าที่แม่นยำครับ

ค่าปริยายของตำแหน่งทศนิยมอยู่ที่ 28 หลัก คือ

จะเห็นว่าเมื่อนำมาคำนวณ ความแม่นยำจะถอยกลับมาที่ 28 ตำแหน่ง ถ้าต้องการความละเอียดมากกว่านั้น

และการเปลี่ยนวิธีการปัดค่าตัวท้าย



ส่วน fractions เป็นการเก็บเศษส่วนที่เขียนได้ในรูปของจำนวนเต็มหารกัน (จำนวนตรรกยะ) วิธีใช้คือ

แม้ว่า fractions จะไม่สูญเสียความแม่นยำเลย แต่มันก็ไม่สามารถเก็บจำนวนอตรรกยะ (อย่างเช่น sqrt(2)) ก็เลือกใช้เครื่องมือเหล่านี้ให้ถูกงานนะครับ

1 comment:

  1. จริงๆ แล้วอธิบายไม่ถูกเท่าไหร่นะ ปัญหาของ IEEE754/854 คือมันอยู่ในระบบฐานสอง แต่โลกความเป็นจริงมันเป็นฐานสิบ ประเด็นที่เป็นปัญหามากๆ เช่นโลกการเงิน ความผิดพลาด "ตามกฎหมาย" จะถูกกำหนดให้เป็นฐานสิบ ้เช่น ภาษีคำนวณผิดพลา่ดได้ไม่เกิน 1 สตางค์ต่อใบเสร็จ อะไรแบบนั้น

    การเก็บค่าทศนิยมทุกรูปแบบมีโอกาสสูญเสียความแม่นยำเสมอ เพราะพื้นที่เก็บมีจำกัดยิ่งเป็นจำนวนอตรรกยะเราก็ไม่สามารถเก็บค่าที่แม่นยำได้

    ระบบฐานสิบมันทำให้ความสูญเสียที่เกิดขึ้น เป็นไปในรูปแบบที่เราเข้าใจมันได้

    ReplyDelete