2010-04-28 31 views
5

Có bất kỳ ví dụ nào của một công ty đã bị đốt cháy bởi dữ liệu dấu phẩy động gây ra vấn đề làm tròn không? Chúng tôi đang triển khai một hệ thống mới và tất cả các giá trị tiền tệ được lưu trữ trong phao. Tôi nghĩ rằng nếu tôi có thể hiển thị các ví dụ thực tế về lý do tại sao điều này đã thất bại, nó sẽ có trọng lượng nhiều hơn lý thuyết tại sao các giá trị không thể được lưu trữ đúng cách.Ví dụ thực tế về sự kiện Lỗi dấu chấm động

Trả lời

3

Những examples này là từ thế giới được nhúng (Ariane 5, Patriot) nhưng không phải là lỗi làm tròn dấu chấm động stricto sensu. Lỗi Ariane 5 là lỗi trong chuyển đổi. Lỗi Patriot đã được giới thiệu trong quá trình thích nghi của phần mềm. Nó liên quan đến tính toán trong các lĩnh vực khác nhau với một hằng số vốn không thể miêu tả (mà xảy ra là vô cùng trông ngây thơ 0,10).

Có hai vấn đề tôi thấy trước với phao nhị phân cho các giá trị tiền tệ:

  • giá trị thập phân phổ biến như 0.10 không thể được đại diện một cách chính xác.

  • Nếu độ chính xác quá nhỏ, những gì có thể là tràn bộ lọc làm tăng ngoại lệ sẽ trở thành mất chính xác khó theo dõi.

Lưu ý rằng định dạng dấu chấm động cơ số 10 đã được chuẩn hóa một cách chính xác cho các giá trị tiền tệ: một số đồng tiền có giá trị 1/1000000 của một đô la, không bao giờ được trao đổi trong vòng chưa đầy ngàn, và số tiền tối đa mà bạn có thể muốn để có thể đại diện là tỷ lệ lớn, do đó, một đại diện có thể mở rộng có ý nghĩa. Mục đích là phần định trị đủ lớn cho số tiền lớn nhất với độ phân giải chính thức.

+0

Tốt, mặc dù giây thứ hai cho thấy lý do nổi sẽ là một điều tốt - nếu nhất quán. –

+0

@Michael Có, xin lỗi, tôi muốn mở rộng trên đó, nhưng tôi đã được gọi đi. –

+0

holy crap ... Tôi nghĩ rằng tôi đã đánh dấu điều này là câu trả lời. xin lỗi vì điều đó. Chỉ một năm rưỡi sau đó ... – Rob

0

Tôi đã làm việc trên một hệ thống tính toán tăng lương và tiền thưởng của mọi người. Các tính toán tương đối phức tạp do số lượng các bộ phận (hiệu suất công ty, hoạt động bộ phận, hiệu suất cá nhân) nhưng mỗi phần là đủ đơn giản (tỷ lệ thường phức tạp) cái gì đó như:

personal_bonus = lương * personal_bonus_percentage

department_bonus = personal_bonus * 50%

company_bonus = personal_bonus * 110%

total_bonus = personal_bonus + department_bonus + company_bonus

Trường hợp personal_bonus_percentage là giá trị được tính dựa trên kích thước của nồi tiền thưởng, xếp hạng của người đó và những người có xếp hạng đó.

Khi chúng tôi thử nghiệm, chúng tôi đã không tính toán theo cách thủ công (tức là trên giấy), kết quả sẽ là gì, thay vì so sánh chúng với Excel đang chạy cùng một công thức. Nhân viên đã làm các phép tính trên giấy và khi chúng tôi viết lại thuật toán để chống lại vấn đề dấu chấm động khoảng 5% của các giải thưởng là sai.

0

Tôi không nghĩ rằng bạn sẽ tìm thấy bất kỳ ai thực sự bị đốt cháy. Tôi đã nghe nói về các công ty mà các chương trình trả lương hoặc lãi suất sử dụng dấu phẩy động thay vì số thập phân cố định và lập trình viên thu thập các bit phân đoạn từ tất cả các tài khoản để tham ô mà không có chủ tài khoản tăng báo động. Nhưng, thứ đó thường được cố định một cách lặng lẽ vài năm trước. Bây giờ có những quy tắc thực hành tốt nhất để ngăn chặn điều đó.

Cách khác mà lỗi có thể đủ lớn để bạn đi du lịch là nếu bạn cố ngoại suy từ một mẫu nhỏ. Giống như tham gia một cuộc thăm dò ở một thị trấn nhỏ và cố gắng dự đoán kết quả phổ biến cho cả nước.

Tôi đã làm việc trên một dự án tháng khác mà chúng tôi đã sử dụng phép tính ma trận để tính toán đa thức cho đường cong hiệu chuẩn. Các hệ số từ chương trình của chúng tôi đã xuất hiện hoàn toàn khác với các hệ số được thực hiện trên bảng tính. Khi tôi đi qua cả chương trình và bảng tính và làm tròn mọi thứ đến đúng số chữ số có nghĩa, thì họ đã đồng ý khá tốt. Khi rác đã được nhân với rác, và sau đó bình phương hoặc hình khối, sau đó nó đã trở thành một vấn đề.

0

Lỗi FPU thực sự duy nhất tôi có thể nghĩ là so sánh bình đẳng trên phao. Ví dụ: 0.123456 và 0.123457 rất gần; trên thực tế, chúng có thể rất tốt nếu chúng là kết quả của một loạt các phép tính trong đó các lỗi làm tròn có thể tích lũy. Thay vì so sánh với ==, bạn nên tạo ra một mờ bằng để xác định xem chúng có đủ gần để được xem là bình đẳng không.

Tìm kiếm nhanh trên google sẽ mở ra trang này, điều này sẽ đi sâu vào các cảnh báo liên quan đến hàm mờ tương đương. http://adtmag.com/articles/2000/03/16/comparing-floats-how-to-determine-if-floating-quantities-are-close-enough-once-a-tolerance-has-been.aspx

1

Tôi đã làm việc trên một nhóm đã tạo ra một FPU (thiết kế phần cứng) đã vượt qua mức testfloat 3 cho độ chính xác đơn, đôi và mở rộng. Có rất nhiều fpus xấu ra khỏi đó, chủ yếu là vá trong phần mềm nếu họ có thể nắm bắt được hướng dẫn hoặc ngoại lệ, loại điều. Tôi nghĩ rằng các anh chàng testfloat cho biết các lỗi fpu chính là trong int float và float để int chuyển đổi, tôi nhớ pentium 4 không thành công vì lý do đó. Pentium III tôi đã trải qua testfloat. Tôi đã không thử nó trong một thời gian, không biết những gì nhà nước của các bộ vi xử lý đa lõi là. Đừng bị lừa khi nghĩ rằng pentium tôi là người duy nhất có lỗi, gần như tất cả, chắc chắn là các công ty có tên tuổi lớn hơn, có lỗi fpu. IEEE 754 là một tiêu chuẩn khủng khiếp, nhận được một fpu để đáp ứng tiêu chuẩn đó là rất khó khăn và rất tốn kém, sau kinh nghiệm đó tôi tránh toán toán dấu chấm động càng nhiều càng tốt. các trình biên dịch và các thư viện c (atof, ftoa, strtod, printf, vv) là một phần của vấn đề, không chỉ là phần cứng.

float chính xác duy nhất chỉ có 23 bit của mantissa, bạn sẽ bắt đầu ném đi đồng xu hoặc đô la hoặc hàng ngàn đô la thường xuyên. Có hoặc không làm tròn. Làm tròn nên trung bình ra nếu dữ liệu là đủ ngẫu nhiên đạt được một xu ở đây mất một xu ở đó. Nếu các mục được theo dõi luôn ở một số kích thước cố định hoặc bị giới hạn số lượng đơn vị. nói các vật dụng ở mức 9,99 hoặc hai cho 15,99 sau đó sự ngẫu nhiên biến mất và làm tròn cũng như phần định trị sẽ khiến ai đó có độ chính xác, dù là công ty hay khách hàng.

Chắc chắn có thể có rất nhiều con số từ 0,00 đến 0,99 mà bạn không thể đại diện, nếu bạn đang giao dịch với số lượng nhỏ bạn sẽ tham gia làm tròn sớm hơn là sau này.

Sử dụng tiền nổi để kiếm tiền chỉ là một ý tưởng tồi, có lẽ bạn đang tìm kiếm đạn để thay đổi điều đó?

Chúng tôi có bộ điều khiển động cơ được điều khiển bởi phần mềm sử dụng một fpu chính xác duy nhất, có một phần của thuật toán điều khiển mà các hằng số phải thêm tối đa 1.0, tôi không biết quy tắc này, chương trình tính toán các hằng số. Chúng tôi đã phải điều chỉnh các lsbit của mantissa trên một trong các hằng số bằng tay để có được bộ điều khiển động cơ để ổn định.

0
double: 1.000167890 
single: 1.000167847 
(b*(b-1)) - (b*b-b): 0.0000000281725079 
(a*(a-1)) - (a*a-a): 0.0000000000000001 
resultSmall - result: 0.000000028172507807931691 
double^12 - single^12:0.000000593091349143648472 

Tôi nhớ rằng lỗi - hoặc lập dị - được sử dụng để tồn tại trong siêu máy tính được thiết kế bởi Seymour Cray. Số nhân của anh ta sẽ chỉ kiểm tra mười hai bit đầu tiên bằng không, trong khi người cộng tìm kiếm 13, để lại một tỷ lệ nhỏ các số có thể bằng 0, nhưng có một số hợp lệ cho số kia.

Một trong những sinh viên của William Kahan đã làm một mô phỏng nhiễu loạn không khí cho rôto máy bay trực thăng sử dụng 360 của IBM khi nó xuất hiện lần đầu với định dạng fp 32 bit bất thường.a - b không được tính chính xác, ngay cả khi hai số nằm trong hệ số hai của nhau, gây ra vấn đề leo thang về độ chính xác bị mất với mỗi phép tính. Do đó, máy tính đã đưa ra kết quả sai.

Kahan có học sinh viết lại mã của mình bằng cách sử dụng đôi, tạo ra các điểm gian hàng chính xác.

Các vấn đề liên quan