Tôi có còn cần sử dụng điểm cố định để đảm bảo máy tính có được kết quả tương tự cho các phép toán nữa không?


9

Tôi được bảo rằng hầu hết các máy tính hiện đại đều tuân theo cùng một tiêu chuẩn dấu phẩy động, điều này có nghĩa là tất cả chúng sẽ nhận được cùng một câu trả lời nổi cho một phép toán nhất định nếu các đầu vào giống nhau?

Tôi hỏi bởi vì tôi đang nghiên cứu để tạo ra một trò chơi RTS trên mạng và đồng bộ hóa hàng trăm vị trí của đơn vị nghe có vẻ là một cách tồi tệ.

Vì vậy, nếu tôi chỉ gửi đầu vào, tôi cần phải đảm bảo tất cả các khách hàng nhận được kết quả tương tự bằng cách cho họ chạy mô phỏng từ các đầu vào đó.

Tôi đọc được rằng các trò chơi RTS cũ hơn đã sử dụng số học điểm cố định, nhưng tôi không biết liệu điều đó có còn bắt buộc trên các máy tính hiện đại không nếu tất cả chúng đều tuân thủ cùng một tiêu chuẩn? Tôi cũng được thông báo rằng mặc dù không chính xác, kết quả của dấu phẩy động là xác định cho cùng một đầu vào (mà tôi cho rằng có nghĩa là bất kỳ máy tính nào theo cùng tiêu chuẩn đều có cùng kết quả không chính xác?).

Các máy tính vẫn có độ lệch ngay cả khi chúng tuân theo cùng tiêu chuẩn dấu phẩy động?

Tôi đang viết trò chơi này bằng C # không chắc là có vấn đề gì không, dù sao tôi cũng nghĩ là tôi sẽ đề cập đến nó.


Ngay cả khi họ đã làm, tôi sẽ không sử dụng phao cho điều đó
Telastyn

Ý anh là gì ? Tại sao không?
WDUK

Việc sử dụng phao dù sao cũng có thể là điều không mong muốn vì hành vi có thể phụ thuộc vào vị trí trên bản đồ. Far Lands của Minecraft là một ví dụ đáng chú ý hơn: chuyển động, kết xuất và tạo địa hình sẽ trở nên rối mắt khi bạn di chuyển ra xa điểm sinh sản.
amon

Câu trả lời:


18

Các máy tính vẫn có độ lệch ngay cả khi chúng tuân theo cùng tiêu chuẩn dấu phẩy động?

Thật không may, có, đặc biệt là khi bạn sử dụng C # (hoặc ngôn ngữ được biên dịch JIT khác). Vấn đề xảy ra ở đây là giai đoạn biên dịch JIT trên một số kiến ​​trúc bộ xử lý tạo ra mã sử dụng nhiều thanh ghi CPU hơn so với các kiến ​​trúc khác. Điều này có thể dẫn đến các tình huống trên một số máy, độ chính xác điểm nổi mở rộng được sử dụng cho các hoạt động nhất định, trong khi trên các máy khác thì không. Điều này có nghĩa là với mỗi phép tính lặp sử dụng nhân đôi, có một cơ hội để tạo ra các lỗi làm tròn tích lũy khác nhau.

Đó không phải là một vấn đề giả định, tôi có kinh nghiệm trực tiếp với những sai lệch như vậy trong phần mềm mô phỏng kỹ thuật đương đại, trên phần cứng ít nhiều hiện đại. Vấn đề này khiến cho việc tạo các thử nghiệm hồi quy đáng tin cậy cho các phép tính dấu phẩy động phức tạp tạo ra kết quả chính xác giống nhau trên tất cả các máy liên quan.


Điều này. Một số nguyên nhân gốc: IEEE Std 754 bao gồm các mệnh đề "nên" tùy chọn (ví dụ: xử lý NaN) và cho phép các phương án thiết kế (ví dụ: phát hiện dòng chảy). Theo như các ràng buộc ngôn ngữ hỗ trợ tiêu chuẩn dấu phẩy động, chúng vẫn có thể mất thời gian cho trình biên dịch khi đánh giá các biểu thức dấu phẩy động, ví dụ như FLT_EVAL_METHODtrong ISO C / C ++. Chức năng siêu việt (ví dụ sin, exp, log) đều được phần lớn không được kiểm soát bởi cả hai tiêu chuẩn dấu chấm động IEEE và lập trình tiêu chuẩn ngôn ngữ. Nâng cấp phiên bản thư viện đơn giản (ví dụ: glibcphiên bản mới ) có thể khiến kết quả khác nhau.
njuffa

Tôi đã tự đánh nó trong một trò chơi. Tên lửa bay tốt trên máy tính xách tay của tôi, sẽ không bay trên máy tính để bàn của tôi, cài đặt hoàn toàn giống hệt nhau.
Loren Pechtel

3

Lỗi dấu phẩy động

Mỗi số dấu phẩy động tích lũy không chính xác khi nó được sử dụng để tính toán. Đây là một thực tế đơn giản của việc sử dụng định dạng không chính xác để tính toán. Các tính toán cũng nhạy cảm với thứ tự tính toán, tính giao hoán không được đảm bảo, nghĩa là: (a + b) + ccó thể hoặc không thể giống như a + (b + c).

Ngoài ra, bộ xử lý không nhất thiết phải có cùng độ dài với tiêu chuẩn bộ nhớ. Điều này có thể tạo ra hành vi thú vị khi float 32/64/128 thỉnh thoảng hoạt động như thể chúng có nhiều bit hơn.

Lỗi điểm cố định

Điều đó đang được nói số học điểm cố định cũng có thể tích lũy lỗi. Sự khác biệt là số điểm cố định rõ ràng về độ chính xác bị mất và tùy thuộc vào các thao tác được chọn có thể tránh được các lỗi làm tròn hoàn toàn. Họ cũng giao hoán (a + b) + c = a + (b + c).

Cái nào?

Cái nào để sử dụng phụ thuộc hoàn toàn vào những tính chất bạn cần.

Số dấu phẩy động:

  • đưa ra một loạt các giá trị trở nên rất gần, và dần dần tách ra ở các thái cực.
  • nhạy cảm với thứ tự tính toán
  • tích lũy sai số làm tròn theo thời gian.
  • có thể có hành vi thất thường do không phù hợp với kích thước phần cứng / bộ nhớ.

Số điểm cố định:

  • đưa ra một phạm vi số nhỏ hơn với cùng khoảng cách giữa hai số liên tiếp bất kỳ.
  • ít nhạy cảm với thứ tự tính toán
  • rõ ràng hơn về lỗi làm tròn
  • có thể được làm việc với để giảm thiểu / tránh các vấn đề làm tròn.

1
"số điểm cố định rõ ràng về độ chính xác bị mất" - điểm nổi cũng rõ ràng, sự khác biệt là điểm không chính xác của điểm cố định trực quan hơn với cách đánh số cuộc sống thông thường
whatsisname 10/12/18

1
Vì vậy, chỉ có điểm cố định đảm bảo tất cả các máy tính bất kể phần cứng, vv sẽ gặp cùng một lỗi / mất độ chính xác?
WDUK

1
Về cơ bản, có, bởi vì bạn có thể chỉ định rằng số điểm cố định của bạn là 32 hoặc 64 bit, và chúng sẽ có trên tất cả các hệ thống. Số dấu phẩy động có thể là 32 hoặc 64 bit, nhưng phần cứng thực sự có thể sử dụng 48 hoặc 96 bit để thực hiện phép tính và chuyển đổi thành 32 hoặc 64 bit ở cuối dẫn đến sự khác biệt giữa các loại phần cứng khác nhau.
dùng1118321

@whatsisname Mặc dù các thông số kỹ thuật của dấu phẩy động khá rõ ràng, bạn không thể dễ dàng cho tôi biết những vấn đề làm tròn nào tôi sẽ gặp phải trong tổng số này : (a + b * c) / d - e. Ngoại trừ các vấn đề rõ ràng như NaN, chia cho 0 hoặc tràn / tràn, có thể biểu thức này không chính xác. Thêm vào đó, trở kháng giữa bộ nhớ và đăng ký về độ chính xác và thậm chí tải / lưu trữ đơn giản từ bộ nhớ của giá trị dấu phẩy động "giống nhau" sẽ thay đổi câu trả lời.
Kain0_0

@ Kain0_0: bạn nói đúng, tôi không thể dễ dàng nói cho bạn biết tôi sẽ gặp phải điều gì, vì tôi không phải là chuyên gia về điểm nổi. Đó chính xác là những gì có nghĩa khi tôi nói "trực quan hơn với việc đánh số cuộc sống thông thường". Khi bạn nói điểm cố định là "rõ ràng" và điểm nổi thì không, bạn làm cho âm thanh như thể những chiếc phao dường như không chính xác một cách ngẫu nhiên.
whatsisname

-1

Có câu hỏi tại sao bạn muốn đảm bảo kết quả giống hệt nhau, vì kết quả giống hệt nhau không đảm bảo rằng kết quả của bạn là hữu ích .

Bạn có thể có một thuật toán không ổn định về số lượng mang lại hai kết quả giống hệt nhau nhưng hoàn toàn vô nghĩa trong các máy tính khác nhau. Nếu có sự khác biệt, nhưng kết quả là như nhau trong vòng 13 chữ số, điều đó đáng tin cậy hơn nhiều.

Có rất ít tình huống mà độ tái lập thực sự quan trọng: trong một công cụ bố trí, hoặc nén / giải nén không mất mát. Sử dụng điểm cố định rất có thể bị nhầm lẫn.


Tôi đã không đánh giá thấp câu trả lời của bạn, nhưng có vẻ như trường hợp được OP mô tả chính xác là "một trong số ít những tình huống mà khả năng tái tạo thực sự quan trọng". Trong trò chơi RTS, một lỗi làm tròn nhỏ có thể tạo ra sự khác biệt giữa "hai đối tượng va chạm" hay không.
Doc Brown
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.