ทำไมบางภาษาปัดเศษเป็นจำนวนเต็ม EVEN ที่ใกล้ที่สุด


44

ภาษาโปรแกรมเช่น Scheme (R5RS) และ Python ( ดูคำถามนี้ ) ไปทางเลขจำนวนเต็มคู่ที่ใกล้ที่สุดเมื่อค่าอยู่ระหว่างจำนวนเต็มโดยรอบ

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

(R5RS อ้างอิงมาตรฐานจุดลอยตัว IEEE เป็นแหล่งที่มาของพฤติกรรมนี้)


4
คุณอ่านfloating-point-gui.deหรือไม่
Basile Starynkevitch

1
IEEE อนุญาตให้ใช้หลายโหมดปัดเศษ นี่คือหนึ่งในนั้น บางภาษาอนุญาตให้เปลี่ยนโหมดการปัดเศษในระหว่างการดำเนินการ
Tobias Brandt

5
คุณอาจต้องการอ่านหัวข้อTie- break สำหรับการปัดเศษใน Wikipedia และการเชื่อมโยงเหตุผลที่อยู่เบื้องหลังแต่ละอัน


1
"แม้ว่าจะเป็นเรื่องของการพูดคุยกับตัวเลขจุดลอยตัวที่แน่นอน" มันไม่ใช่เรื่องของการสนทนา แต่มันถูกระบุไว้อย่างแม่นยำมาก ตัวอย่างเช่นตัวเลขที่เกี่ยวข้องที่นี่ (เช่น 42.5) สามารถแสดงได้อย่างแม่นยำเพราะเป็นเศษส่วนไบนารี สิ่งที่ไม่สามารถแสดงได้อย่างแน่นอนคือเศษส่วนอื่นที่ไม่ใช่ไบนารีรวมถึงเศษส่วนทศนิยม
svick

คำตอบ:


39

เมื่อไม่นานมานี้ฉันได้สร้างโปรแกรมทดสอบสำหรับการปัดเศษแบบต่อเนื่องเพราะโดยทั่วไปแล้วมันเป็นการทดสอบความเครียดที่แย่ที่สุดสำหรับอัลกอริทึมการปัดเศษ

สำหรับแต่ละหมายเลขจาก 0 ถึง 9,999 มันจะปัดเศษเป็น 10 ใกล้ที่สุดจากนั้นเป็น 100 ที่ใกล้ที่สุดจากนั้นเป็น 1,000 ที่ใกล้ที่สุด (คุณอาจคิดว่านี่เป็น 10,000 คะแนนใน [0,1) ที่ถูกปัดเศษเป็น 3 แห่งจากนั้น ถึง 2 จากนั้นถึง 1) ชุดของตัวเลขนี้มีค่าเฉลี่ย 4999.5

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

0     445
1000  1000
2000  1000
3000  1000
4000  1000
5000  1000
6000  1000
7000  1000
8000  1000
9000  1000
10000 555

ผลที่ได้จะแตกต่างจาก "ครึ่งรอบขึ้นไป" ที่ใกล้เคียงที่สุดกับ 550 550 ครั้งจาก 10,000 ครั้งและค่าเฉลี่ยของการปัดเศษคือ 5055 (สูงกว่าค่าเฉลี่ยเดิม 55.5)

หากการปัดเศษทั้งสามรอบเสร็จสิ้นโดย "round half down" ผลลัพธ์จะเป็น:

0     556
1000  1000
2000  1000
3000  1000
4000  1000
5000  1000
6000  1000
7000  1000
8000  1000
9000  1000
10000 444

ผลที่ได้จะแตกต่างจากเดี่ยว "ปัดครึ่งลง" ถึงพัน 550 ครั้งที่ใกล้เคียงที่สุดจาก 10,000 ครั้งและค่าที่ปัดเศษโดยเฉลี่ยคือ 4944 (ต่ำเกินไป 55.5)

หากการปัดเศษทั้งสามเสร็จสิ้นโดยใช้ "round half odd" ผลลัพธ์จะเป็น:

0     445
1000  1111
2000  889
3000  1111
4000  889
5000  1111
6000  889
7000  1111
8000  889
9000  1111
10000 444

ผลที่ได้จะแตกต่างจาก "ครึ่งรอบคี่" เดี่ยวไปถึงพัน 550 ครั้งที่ใกล้เคียงที่สุดจาก 10,000 ครั้งและค่าการปัดเศษโดยเฉลี่ยคือ 4999.5 (ถูกต้อง)

สุดท้ายหากการปัดเศษทั้งสามเสร็จสิ้นโดยใช้ "round half even" ผลลัพธ์จะเป็น:

0     546
1000  909
2000  1091
3000  909
4000  1091
5000  909
6000  1091
7000  909
8000  1091
9000  909
10000 1091

ผลลัพธ์จะแตกต่างจาก "ครึ่งรอบแม้แต่" ที่ใกล้เคียงกับพัน450ครั้งจาก 10,000 ครั้งและค่าการปัดเศษโดยเฉลี่ยคือ 4999.5 (ถูกต้อง)

ฉันคิดว่ามันชัดเจนว่าการปัดเศษครึ่งขึ้นและปัดครึ่งมีอคติกับค่าที่ปัดเศษดังนั้นค่าเฉลี่ยของค่าที่ปัดเศษจะไม่มีความคาดหวังเช่นเดียวกับค่าเฉลี่ยของค่าดั้งเดิมอีกต่อไปและ "รอบครึ่งคู่" และ "รอบครึ่งคี่ "ลบอคติโดยการทำ 5 ครึ่งทางครึ่งหนึ่งและอีกครึ่งหนึ่ง การปัดเศษแบบต่อเนื่องคูณอคติ

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

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


55

มันเรียกว่าการปัดเศษของนายธนาคาร แนวคิดคือเพื่อลดข้อผิดพลาดสะสมจากการปัดเศษจำนวนมาก

ให้บอกว่าคุณปัดเศษ 0.5 ลงเสมอ ลองนึกถึงการจ่ายดอกเบี้ยเพียงเล็กน้อยเหล่านี้ธนาคารแทงครึ่งครั้งในแต่ละครั้ง ...

ให้บอกว่าคุณปัดขึ้น 0.5 การบัญชีกำลังกรีดร้องเพราะคุณจ่ายดอกเบี้ยมากกว่าที่ควร


6
แต่ทำไมถึงแปลกและไม่แปลก
วงล้อประหลาด

17
@ ratchetfreak - ตัวเลขที่มีขนาดเล็กมากปัดเศษไม่ให้ห่างศูนย์ นอกจากนั้นมันเป็นเรื่องที่ไม่มีเหตุผล - ต้องเป็นบางสิ่งบางอย่าง
Jonathan Dursi

15
@ratchetfreak: จะเกิดอะไรขึ้นถ้าคุณเริ่มต้นด้วยหมายเลข 1 หารด้วย 2 และปัดเป็นคี่ คุณได้ 0.5 ปัดเศษเป็น 1 จะเป็นอย่างไรถ้าคุณหารด้วย 2 อีกครั้ง? คุณได้ 0.5 ปัดเศษเป็น 1 และอื่น ๆ ไม่กลายเป็นศูนย์
gnasher729

13
ฉันคิดว่าแม้แต่ตัวเลขก็ควรเป็นเลขคี่เพราะพวกมันลดความน่าจะเป็นสำหรับความจำเป็นในการปัดเศษ dilemmas ที่ตามมา หารด้วย (แน่นอน) สองการดำเนินการค่อนข้างบ่อยในทางปฏิบัติ
Marc van Leeuwen

4
มันเป็นสิ่งสำคัญในสถิติเช่นกัน ถ้าสมาชิกเศษส่วนของชุดข้อมูลทุกอันถูกปัดขึ้นสถิติเชิงพรรณนาเช่นค่าเฉลี่ยจะสูงกว่าเล็กน้อย บทนำสู่ระบาดวิทยาของ Kenneth Rothman กล่าวถึงการปัดเศษเทอร์มินัล. 5 (หรือ. 005 หรืออะไรก็ตาม) ขึ้นเรื่อย ๆ เมื่อค่อย ๆ biasing ฐานข้อมูลไปสู่ตัวเลขที่สูงขึ้น แต่การปัดเศษเป็นเลขคี่หรือคี่
Will Murphy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.