Tại sao một số ngôn ngữ làm tròn đến số nguyên EVEN gần nhất?


44

Các ngôn ngữ lập trình như Scheme (R5RS) và Python ( xem Câu hỏi này ) xoay quanh số nguyên chẵn gần nhất khi giá trị nằm chính xác giữa các số nguyên xung quanh.

Lý do đằng sau này là gì?
Có một ý tưởng toán học làm cho các tính toán sau dễ dàng hơn để lý luận về?

(R5RS tham chiếu tiêu chuẩn điểm nổi của IEEE là nguồn của hành vi này.)


4
Bạn đã đọc nổi-point-gui.de ?
Basile Starynkevitch

1
IEEE cho phép nhiều chế độ làm tròn. Đây là một trong số họ. Một số ngôn ngữ thậm chí cho phép thay đổi chế độ làm tròn trong khi thực hiện.
Tobias Brandt

5
Bạn có thể muốn đọc phần Tie-break để làm tròn trên Wikipedia và lý do liên kết đằng sau mỗi người trong số họ.


1
"Mặc dù chính xác là vấn đề thảo luận với số dấu phẩy động" Đây không phải là vấn đề thảo luận, nó được chỉ định rất chính xác. Ví dụ, các số có liên quan ở đây (như 42,5) có thể được biểu diễn chính xác, bởi vì chúng là các phân số nhị phân. Những gì không thể được biểu diễn chính xác là các phân số khác với nhị phân, bao gồm cả phân số thập phân.
Svick

Câu trả lời:


39

Cách đây một thời gian, tôi đã xây dựng một chương trình thử nghiệm để làm tròn liên tiếp, bởi vì về cơ bản, đây là một thử nghiệm ứng suất trong trường hợp xấu nhất cho thuật toán làm tròn.

Đối với mỗi số từ 0 đến 9,999, số đầu tiên của nó sẽ đến 10 số gần nhất, sau đó đến 100 gần nhất, sau đó đến 1000 gần nhất (Bạn cũng có thể nghĩ rằng 10.000 điểm trong [0,1) được làm tròn đến 3 vị trí, sau đó đến 2, sau đó đến 1.) Tập hợp số này có giá trị trung bình là 4999,5.

Nếu tất cả ba vòng được thực hiện bằng phương pháp "làm tròn một nửa", thì kết quả sẽ như sau (cột đầu tiên là kết quả làm tròn, cột thứ hai là có bao nhiêu số được làm tròn đến kết quả đó - tức là biểu đồ).

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

Kết quả khác với một "nửa vòng lên" đơn lẻ đến hàng nghìn 550 lần gần nhất trong số 10.000 và giá trị làm tròn trung bình là 5055 (cao hơn mức trung bình ban đầu là 55,5).

Nếu tất cả ba vòng được thực hiện bằng cách "làm tròn một nửa", thì kết quả là:

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

Kết quả khác với một "nửa vòng xuống" duy nhất đến hàng nghìn 550 lần gần nhất trong số 10.000 và giá trị làm tròn trung bình là 4944 (quá thấp 55,5).

Nếu tất cả ba vòng được thực hiện bằng cách sử dụng "vòng nửa lẻ", kết quả là:

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

Kết quả khác với một "số lẻ nửa vòng" đơn lẻ đến hàng nghìn 550 lần gần nhất trong số 10.000 và giá trị làm tròn trung bình là 4999,5 (đúng).

Cuối cùng, nếu cả ba vòng đều được thực hiện bằng cách sử dụng "nửa vòng chẵn", kết quả là:

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

Kết quả khác với một "nửa chẵn" đơn lẻ đến hàng nghìn 450 lần gần nhất trong số 10.000 và giá trị làm tròn trung bình là 4999,5 (đúng).

Tôi nghĩ rõ ràng là làm tròn một nửa và nửa xuống làm lệch các giá trị được làm tròn, do đó trung bình của các giá trị được làm tròn không còn có cùng kỳ vọng như trung bình của các giá trị ban đầu và "nửa tròn chẵn" và "nửa tròn lẻ "Xóa bỏ sự thiên vị bằng cách xử lý 5 cách một nửa thời gian và cách khác nửa còn lại. Làm tròn liên tiếp nhân lên sự thiên vị.

Vòng nửa chẵn và nửa tròn lẻ giới thiệu loại sai lệch của riêng chúng đối với phân phối: lần lượt là độ lệch đối với các chữ số chẵn và lẻ. Trong cả hai trường hợp, một lần nữa, sự thiên vị này được nhân lên bằng cách làm tròn liên tiếp, nhưng điều tồi tệ hơn đối với vòng nửa lẻ. Tôi nghĩ rằng lời giải thích trong trường hợp này rất đơn giản: 5 là một số lẻ, do đó, một nửa số lẻ có nhiều kết quả kết thúc bằng 5 hơn một nửa số chẵn - và do đó, nhiều kết quả sẽ phải được xử lý đặc biệt bằng cách làm tròn tiếp theo .

Vì vậy, dù sao đi nữa, trong bốn lựa chọn, chỉ có hai lựa chọn không thiên vị, và trong hai lựa chọn không thiên vị, một nửa vòng thậm chí còn cho phân phối ứng xử tốt nhất khi làm tròn số lặp lại.


55

Nó được gọi là làm tròn ngân hàng. Ý tưởng là để giảm thiểu lỗi tích lũy từ nhiều thao tác làm tròn.

Hãy nói rằng bạn luôn làm tròn .5 xuống. Hãy nghĩ về tất cả những khoản thanh toán lãi nhỏ, ngân hàng bỏ túi nửa xu mỗi lần ...

Hãy nói rằng bạn luôn làm tròn .5 lên. Kế toán sẽ hét lên vì bạn đang trả lãi nhiều hơn mức bạn nên.


6
nhưng tại sao chẵn và không lẻ?
ratchet freak

17
@ratchetfreak - số nhỏ như vậy làm tròn, không cách xa, không. Ngoài ra, đó là tùy ý - phải là một cái gì đó.
Jonathan Dursi

15
@ratchetfreak: Điều gì sẽ xảy ra nếu bạn bắt đầu với số 1, chia cho 2 và làm tròn thành số lẻ? Bạn nhận được 0,5 làm tròn thành 1. Điều gì sẽ xảy ra nếu bạn chia cho 2 lần nữa? Bạn nhận được 0,5 làm tròn thành 1. Và như vậy. Không bao giờ trở thành số không.
gnasher729

13
Tôi nghĩ rằng các số chẵn cũng được ưu tiên hơn các số lẻ vì chúng làm giảm xác suất cho sự cần thiết của các tình huống khó xử làm tròn tiếp theo . Phân chia theo (chính xác) hai là một hoạt động khá thường xuyên trong thực tế.
Marc van Leeuwen

4
Nó cũng quan trọng trong thống kê. Nếu mọi thành viên phân đoạn của tập dữ liệu được làm tròn lên, các số liệu thống kê mô tả như giá trị trung bình sẽ cao hơn (một chút) so với khi nó được làm tròn xuống. Giới thiệu về Dịch tễ học của Kenneth Rothman đặc biệt đề cập đến việc luôn làm tròn thiết bị đầu cuối .5 (hoặc .005, hoặc bất cứ điều gì) khi dần dần thiên vị một cơ sở dữ liệu về số cao hơn, nhưng luôn làm tròn đến số chẵn hoặc số lẻ không làm sai lệch trung bình.
Will Murphy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.