Giải thích độ chính xác của dấu phẩy động cho khách hàng [đóng]


23

Cách tốt nhất để giải thích vấn đề làm tròn điểm nổi cho khách hàng là gì?

tôi biết

http://doad.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

cũng như các mục trong Câu hỏi thường gặp về C ++ và nhiều trang khác nhắm đến các nhà phát triển và nhà khoa học, nhưng liệu có một trang web, bài báo hoặc giải thích nào, nhắm vào khách hàng "thường xuyên" với nền tảng toán học hoặc khoa học hạn chế không? (trong đó các tài liệu tham khảo ở trên rơi xuống).

Nếu nó được duy trì hoặc đến từ một tổ chức hoặc tập đoàn nổi tiếng và được công nhận, thì tốt hơn, như một số bạn có thể đã trải qua, có thể hơi phức tạp để giải thích điều đó cho chính bạn.


1
Tôi sẽ không làm phiền ...
John Trục

1
Đây là một câu hỏi thực sự tuyệt vời, +10 nếu tôi có thể. Một vấn đề thường xuyên cho các nhà phát triển.
Cody Grey

2
Đây không phải là vấn đề chi tiết, nó trả lời fi tại sao việc thêm vào số chính xác 2 chữ số thập phân, kết thúc bằng 5.9999999 chứ không phải 6 và tại sao bạn phải chỉ định độ chính xác làm tròn khi kết quả "không rõ ràng" t có nhiều hơn hai chữ số thập phân. Hoặc tại sao đôi khi 2 trừ 2 không phải luôn luôn bằng 0 và không giống như một kẻ ngốc trong khi làm như vậy.
Eric Grange

9
@Eric Grange: nếu khách hàng của bạn coi những vấn đề chính xác đó là một lỗi, thì đó một lỗi và bạn phải tìm cách khắc phục nó (có thể bằng cách không sử dụng float). Họ không quan tâm đến vấn đề chính xác này đến từ đâu. Họ không quan tâm đến cách phần mềm của bạn hoạt động. Họ chỉ muốn nó hoạt động.
David

3
@Eric: Việc sử dụng dấu phẩy động một chi tiết triển khai. Tôi nhắc lại câu hỏi của mình, yêu cầu không có gì được giải thích trong câu hỏi, và điều mà tôi rõ ràng là không làm rõ (xin lỗi): bối cảnh là gì và tại sao bạn lại thảo luận về việc sử dụng điểm nổi với khách hàng?
Tom Anderson

Câu trả lời:


8

Tôi tìm thấy một cách đơn giản để giải thích điều này là để chứng minh điều đó. Thảo luận về cách chia xcho một số, sau đó nhân với cùng một số sẽ đưa bạn xtrở lại một lần nữa - khiến khách hàng đồng ý rằng điều này sẽ luôn luôn như vậy. Sau đó, làm cũ (100 / 3) * 3trên một máy tính; cho thấy giá trị không, như bạn mong đợi, trở về 100. Khi hầu hết mọi người thấy toán học rõ ràng "phá vỡ", sau đó có xu hướng 'nhận' sự nguy hiểm của các số dấu phẩy động trong đó độ chính xác là quan trọng (mặc dù trong trực quan cách, thay vì ở mức độ thấp mà bài viết bạn chỉ đến).

Thật không may, hầu hết các máy tính nửa vời (chắc chắn là tất cả các máy tính khoa học mà tôi đã thấy và hơn một vài máy tính cơ bản) hiện nay đều có thể xử lý việc này - tôi cho rằng chúng đang lưu trữ các chữ số phụ ngoài những gì có thể hiển thị và làm tròn - cũng vậy kiểm tra xem máy tính của bạn thông minh đến mức nào trước khi bạn làm điều đó trước mặt khách hàng.


1
Có, hầu như tất cả các máy tính đều lưu trữ ít nhất 2 chữ số phụ, do đó bạn phải thêm một vài bội số vào hỗn hợp, điều này làm vẩn đục lời giải thích và IME khiến chúng nghĩ rằng bạn đang cố gắng đánh lừa chúng. Căn bậc hai đòi hỏi ít thao tác hơn, nhưng căn bậc hai đã nằm ngoài lĩnh vực hàng ngày của khách hàng thường xuyên.
Eric Grange

2
@Scott Tôi đã thử trên một vài máy tính ở đây, không có vấn đề nào được thể hiện với (100/3) * 3, thậm chí (100/3) * 3-100 không thể hiện vấn đề .... Excel cũng hiểu đúng.
Eric Grange

9
Lấy tiền làm ví dụ, có độ chính xác giới hạn hoàn hảo. Giải thích bạn chia ra một đô la, sau đó mỗi người nhận được 33 xu và một xu bị mất khi làm tròn số. Bất cứ ai cũng có thể liên quan đến điều đó.
Inca

4
Đừng bận tâm với máy tính. Chia 1 cho 3 trên giấy, giữ ba chữ số có nghĩa.
David Thornley

5
@omegómauri nếu bạn nghĩ rằng lời giải thích đó có ích, tôi đoán bạn không nói chuyện với khách hàng thường xuyên.
jhocking

5

Tôi không nghĩ có những phím tắt. Bạn phải:

  • Hiểu điểm nổi là gì và cách nó hoạt động.

Hoặc, nếu yêu cầu quá nhiều, bạn phải:

  • Chấp nhận rằng máy tính sẽ không cung cấp cho bạn kết quả số chính xác.

Có thể một ví dụ với các số vô tỷ sẽ giúp (mặc dù các vấn đề về dấu phẩy động cũng áp dụng cho các số hữu tỷ) : sqrt(2) ~ 1.414. Sau đó 1.414^2 = 1.999396. Cho dù bạn có bao nhiêu chữ số, bạn sẽ không bao giờ trở lại hoàn toàn với bản gốc 2. Ok, 4 chữ số chính xác có thể được chấp nhận, nhưng sau đó xem xét những gì xảy ra khi loại "lỗi làm tròn" này tích lũy. Đó là nơi nguy hiểm thực sự.


2
Cá nhân tôi biết và hiểu, nhưng đối với một số người, "dấu phẩy động" đã là một thuật ngữ xa lạ, vì vậy bạn cần nhiều hơn giải thích về toán học hoặc khoa học để giải thích rằng những gì họ có thể tính toán ngay trong đầu, máy tính và phần mềm đắt tiền của họ gặp khó khăn khi hiểu đúng ;) Ngoài ra căn bậc hai nằm ngoài lĩnh vực hàng ngày của khách hàng thường xuyên.
Eric Grange

5

Đầu tiên, xác định những gì họ đang phàn nàn về. Các giao dịch tài chính phải được thực hiện chính xác, với đúng số thập phân và quy tắc làm tròn đúng. Điều này thường có nghĩa là duy trì số nguyên của các đơn vị tiền tệ và đảm bảo số học được thực hiện đúng.

Ngoài ra, họ có thể phàn nàn về màn hình quá chính xác và việc giảm số lượng chữ số đầu ra có thể là tất cả những gì cần thiết.

Đối với các số nói chung, bạn luôn có thể cố gắng đưa ra số thập phân ba chữ số x sao cho x * 3 là 10. Điều đó cho thấy các nguyên tắc cơ bản.

Có hai vấn đề còn lại. Một là các số nhất định có thể được biểu thị chính xác bằng số thập phân nhưng không phải là số nhị phân (3.15, giả sử). Điều đó sẽ khó giải thích với những người không có kỹ thuật, và cách tốt nhất của bạn là cố gắng tránh nó bằng cách không cung cấp đủ các chữ số có nghĩa cho nó xuất hiện. Người khác là khách hàng biết một chút, đủ để biết rằng số học máy tính không phải lúc nào cũng chính xác và không đủ để nhận ra rằng số học thập phân không phải lúc nào cũng chính xác. Tôi đã tranh luận với một vài trong số đó, và không có gì hữu ích để báo cáo.


3

Số dấu phẩy động trong máy tính sử dụng nhị phân, vì vậy, giống như chúng ta có một hệ thống số với một, hàng chục, hàng trăm và phần mười, cột thứ trăm, số dấu phẩy động trong máy tính thực sự có một số, twos, bốn, và một nửa, phần tư và cột thứ tám. Nếu khách hàng quen thuộc với feet / inch, thì hãy nhắc họ về cách bạn thường sử dụng phân số cơ sở 2 của một inch để đo.

Bây giờ hãy cố gắng lưu trữ 10 xu dưới dạng kết hợp của một nửa, phần tư, tám phần trăm của một đô la. Nó chỉ không hoạt động:

.00011001100110011. . . ( lặp đi lặp lại vô hạn )

Nó giống như lấy một thước đo tiêu chuẩn của đế quốc và cố gắng đo một phần mười inch. Bạn không thể làm điều đó một cách chính xác. Không có đại diện 1/10 là X / Y trong đó X và Y là số nguyên và Y là lũy thừa của 2.

Đó là lý do tại sao chúng tôi có các loại dữ liệu thập phân sử dụng 4 bit để lưu trữ mỗi chữ số thập phân , vì vậy chúng tôi trở lại biểu diễn cơ sở 10. Sự đánh đổi là trong không gian và hiệu suất (khoảng 100% hiệu suất, từ những gì tôi đã đọc).


1

Nói với họ rằng giống như tài khoản ngân hàng của họ không thể giữ 4.4423425908459032890413 ... đô la (đó là $ 4,44 hoặc $ 4,45, không có gì ở giữa), máy tính có thể dễ dàng lưu trữ một số với độ chính xác tùy ý. Sự không hoàn hảo của lưu trữ dẫn đến sự không hoàn hảo của các tính toán.

(Nó hơi gian lận, nhưng nên cho họ biết vấn đề là gì.)


2
Than ôi, lời giải thích đó không hoạt động, vì vấn đề chính xác có thể xảy ra khi tổng hợp các số mà tất cả chỉ có hai chữ số chính xác để bắt đầu.
Eric Grange

1
Hai chữ số thập phân . Vâng, tôi đồng ý, một khách hàng tò mò sẽ phát hiện ra lỗ hổng trong đó. Nhưng sau đó, bạn có thể đánh chúng với cuộc thảo luận về biểu diễn nhị phân - họ đã yêu cầu điều đó ;-)
quant_dev

Chà, đã cố gắng giải thích điểm nổi họ IME ngay lập tức bắt đầu nghĩ rằng bạn đang cố gắng khắc phục họ, đó là điều có thể giảm bớt nếu nó đến bằng những thuật ngữ đơn giản, dễ hiểu, hoặc từ một tổ chức hoặc công ty nổi tiếng. :)
Eric Grange

1
@Eric Math rất khó, chúng ta hãy chơi bóng chày: P
quant_dev

1
Hỏi xem có chính xác hơn để đo một cái gì đó đến 1/10 "gần nhất hoặc milimet gần nhất hay không. Cái sau chính xác hơn, nhưng các vật thể có bội số chính xác là 0,1" sẽ không phải là bội số chính xác của 1mm trừ khi chúng cũng là một bội số chính xác của 5 "(chính xác là 127mm). Thêm kích thước của hai vật 2,54mm được đo đến 0,1" gần nhất sẽ mang lại kích thước kết hợp 0,2 ", cộng các kích thước được làm tròn đến milimet gần nhất sẽ mang lại 6 mm mặc dù kích thước thực tế phải là 5,08mm.
supercat

1

2/3

Yêu cầu họ viết ra câu trả lời chính xác cho hai người chia cho 3.
Vì câu trả lời 'cứ kéo dài mãi mãi', bạn có thể chỉ ra điều đó.

Sử dụng 1/3 cũng sẽ có hiệu quả nhưng 2/3 có lẽ là một ví dụ tốt hơn một chút vì làm tròn mang lại cho bạn (ví dụ) .6666667 trong khi .3333333 có vẻ như nó có thể bị cắt ngắn.


0

Khi thực hiện tính toán, máy tính thường sử dụng xấp xỉ cho các số (như thay vì sử dụng 1000000.7, chúng sử dụng 1000000) vì sử dụng xấp xỉ nhanh hơn nhiều. Vấn đề với điều đó là khi bạn thực hiện các phép tính với xấp xỉ, bạn sẽ lấy lại được xấp xỉ. Thông thường điều đó hoạt động khá tốt, nhưng đôi khi nó dẫn đến kết quả bất ngờ.


Tôi không thực sự hiểu những gì bạn đang nói ở đây. "Bởi vì sử dụng xấp xỉ nhanh hơn nhiều"? Đôi khi số học số nguyên ít nhất là nhanh và chính xác. Đôi khi không có sự thay thế nào (như in ra căn bậc hai của 2).
David Thornley

Vâng, bạn hãy thử giải thích với một nhân viên tiếp thị tại sao máy tính thực sự không thể đại diện cho các số vô tỷ hoặc về cơ bản là bất kỳ số nào trong sơ đồ lớn (ồ và sau đó bạn có thể muốn cho anh ta một bài giảng nhanh về sự bất hợp lý của \ pi: một cái gì đó trên Fourier loạt có thể dễ thương). Xấp xỉ là một từ mà mọi người có thể hiểu. Bạn đang tiếp cận điều này từ quan điểm của một người biết rằng tất cả các số không bằng nhau.

0

Một số tính toán được thực hiện theo một số quy tắc pháp lý. Ví dụ: nếu bạn muốn tính bao nhiêu thuế thu nhập phải trả cho thu nhập hàng năm chịu thuế là 79.245,18 € ở Đức, chỉ có một câu trả lời đúng. Bạn hiểu đúng hoặc bạn hiểu sai. Nếu bạn hiểu đúng, bạn không cần phải giải thích cách số học dấu phẩy động hoạt động. Nếu bạn hiểu sai, bạn không cần phải giải thích cách số học dấu phẩy động hoạt động, bạn phải sửa mã bị hỏng của mình.

Đôi khi bạn hiển thị kết quả không đúng. Ví dụ: nếu bạn chuyển đổi US $ 13,297,46 sang £ £ bằng hai chữ số thập phân và sau đó chuyển đổi số tiền £ UK đó thành US $, bạn có thể không nhận được 13.297,46 đô la Mỹ nhưng 13,297,45 đô la Mỹ Điều đó không có gì để làm với số học dấu phẩy động. Đó là một vấn đề không thể tránh khỏi và tốt hơn là bạn có thể giải thích tại sao nó không thể tránh khỏi. (Bạn cũng nên biết lý do tại sao sự cố không xảy ra khi bạn chuyển đổi từ UK £ sang US $ trở lại).

Có những kết quả khác có thể không đúng. Nếu bạn chuyển đổi số thành tỷ lệ phần trăm, tỷ lệ phần trăm sẽ tăng thêm 100%, nhưng chúng có thể không. Nếu bạn hiển thị bốn phần trăm với hai số thập phân, bốn phần trăm được hiển thị có thể thêm tới 99,99% hoặc 100,01%. Không có gì để làm với số học dấu phẩy động. Tuy nhiên, bạn sẽ có thể giải thích tại sao.

Tiếp theo, có những tình huống sử dụng số học dấu phẩy động bất cẩn dẫn đến kết quả không phù hợp. Ví dụ, a + b + c thường không giống với b + c + a. Nếu điều đó gây ra vấn đề, không có gì để giải thích, đó là điều bạn sửa.

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.