22

Để tăng cường số lượng crunching, tôi đang xem xét sử dụng điểm cố định thay vì dấu phẩy động. Tất nhiên nó sẽ quan trọng bao nhiêu byte loại điểm cố định là kích thước, trên những gì CPU nó sẽ được chạy trên, nếu tôi có thể sử dụng (cho Intel) MMX hoặc SSE hoặc bất cứ điều gì mới đến ...Khi nào sử dụng Fixed Point vào những ngày này

Tôi tự hỏi nếu những ngày này khi điểm trôi nổi chạy nhanh hơn bao giờ hết, liệu nó có đáng để xem xét điểm cố định không? Có quy tắc chung nào về ngón tay cái mà chúng ta có thể nói nó sẽ quan trọng hơn một vài phần trăm không? Tổng quan từ 35.000 feet về hiệu suất số là gì? (BTW, tôi giả định một CPU chung như được tìm thấy trong hầu hết các máy tính, không phải DSP hoặc các hệ thống nhúng chuyên dụng.)

Trả lời

18

Nó vẫn đáng giá. Điểm nổi nhanh hơn trong quá khứ, nhưng điểm cố định cũng là. Và cố định vẫn là cách duy nhất để đi nếu bạn quan tâm đến độ chính xác vượt quá mức bảo đảm của IEEE 754.

+2

+1, bạn có bất kỳ phần mềm đo điểm chuẩn nào mà bạn sử dụng để xác minh điều này cho các kiến ​​trúc khác nhau không. Tôi đã đi đến cùng một kết luận thông qua hồ sơ, nhưng đó là một chút công bằng công việc và kết quả chỉ liên quan đến phần cứng cụ thể mà tôi đã thử nghiệm. Quan tâm đến việc thấy sự khác biệt trên các thiết bị di động với ARM cũng như Intel và AMD phổ biến hơn. –

0

Vì bạn đang sử dụng một CPU đa năng, tôi khuyên bạn không nên sử dụng điểm cố định, trừ khi hiệu suất là rất quan trọng đối với bạn ứng dụng mà bạn phải đếm mỗi tic. Những rắc rối của việc thực hiện điểm cố định, và đối phó với các vấn đề như tràn chỉ là không có giá trị nó, khi bạn có một CPU, mà sẽ làm điều đó cho bạn.

IMHO, điểm cố định chỉ cần thiết khi bạn đang sử dụng DSP mà không hỗ trợ phần cứng cho các hoạt động điểm động.

11

Một lý do khác để sử dụng số thập phân cố định là làm tròn đơn giản hơn nhiều và có thể dự đoán được. Hầu hết các phần mềm tài chính sử dụng điểm thập phân chính xác tùy ý cố định với một nửa thậm chí làm tròn để đại diện cho tiền.

+0

sở thích của tôi không phải là tài chính nhưng đây là một điểm tốt – DarenW

+0

Rất đúng. Điều này cũng áp dụng khi thực hiện mô phỏng thời gian thực được xác định, phân tán. Sự khác biệt tinh tế trong việc triển khai IEEE-754 có thể dẫn đến việc tìm lỗi trong cùng một phép tính có kết quả khác nhau trên các hệ thống phân tán khác nhau, khiến chúng phân kỳ từ trạng thái mô phỏng dự kiến. Xem [bài viết này] (http://gafferongames.com/networking-for-game-programmers/floating-point-determinism/). –

4

Sử dụng điểm cố định khi phần cứng không hỗ trợ dấu phẩy động hoặc triển khai phần cứng.

Cũng hãy cẩn thận khi tạo các lớp cho nó. Một cái gì đó bạn nghĩ rằng sẽ nhanh chóng thực sự có thể trở thành một con chó khi nói đến hồ sơ do (un) bản sao cần thiết của các lớp học. Đó là một câu hỏi khác cho một thời gian tuy nhiên.

+0

Thật thú vị khi biết phần cứng nào không hỗ trợ điểm nổi trong những ngày này. Có vẻ như bây giờ, ngay cả một con chuột giày cũ bị hỏng không nổi điểm ... 8P – DarenW

+1

(btw, tôi mặc dép ở đây ở Florida, vì vậy tôi không lên trên công nghệ dây giày) – DarenW

+2

@ DarenW: Nintendo DS (mà tôi vẫn xem xét một chút mới) không hỗ trợ dấu chấm động thông qua phần cứng. Đó là thiết bị cầm tay duy nhất tôi đã phát triển, nhưng tôi đoán rằng nhiều thiết bị cầm tay khác không có FPU. – Ponkadoodle

5

Gần như luôn luôn nhanh chóng sử dụng điểm cố định (trải nghiệm x86, pentium, 68k và ARM). Nó có thể, tuy nhiên, cũng phụ thuộc vào loại ứng dụng. Đối với lập trình đồ họa (một trong những ứng dụng chính của tôi về điểm cố định) tôi đã có thể tối ưu hóa mã bằng cách sử dụng các bảng cosin dựng sẵn, bảng đăng nhập, vv Nhưng các hoạt động toán học cơ bản cũng đã được chứng minh nhanh hơn.

Nhận xét về phần mềm tài chính. Người ta nói trong một câu trả lời trước đó rằng điểm cố định là hữu ích cho các tính toán tài chính. Theo kinh nghiệm của riêng tôi (phát triển hệ thống quản lý kho bạc lớn và kinh nghiệm xử lý thẻ tín dụng rộng rãi), tôi sẽ KHÔNG sử dụng điểm cố định. Bạn sẽ có lỗi làm tròn bằng cách sử dụng điểm nổi hoặc cố định. Chúng tôi luôn sử dụng toàn bộ số tiền để đại diện cho số tiền, tính số tiền tối thiểu có thể (1c cho Euro hoặc đô la). Điều này đảm bảo không có một phần số tiền bị mất. Khi thực hiện các giá trị tính toán phức tạp được chuyển đổi thành tăng gấp đôi, các quy tắc làm tròn cụ thể của ứng dụng được áp dụng và kết quả được chuyển đổi thành số nguyên.

+0

Trong trường hợp của tôi (tính hoa hồng), chúng tôi sử dụng Java BigDecimal, không chính xác là một điểm cố định, nhưng đến khá gần. Các quy tắc làm tròn thực sự là ứng dụng cụ thể, nhưng 9 lần trong số 10 chúng là một nửa thậm chí. – ddimitrov

+0

Bằng cách tính toán phức tạp, bạn có nghĩa là lãi kép, thuế suất hoặc một số như vậy? Để cộng và trừ số tiền trong một tài khoản, sẽ không cố định được khá nhiều One Way True? Bạn có sử dụng phao nổi trong trường hợp đó không? – DarenW

+1

Tra cứu bảng là một cân nhắc quan trọng trong những gì tôi đang làm, và những gì nhiều người khác có thể cần - điều này không thực tế với điểm nổi. Một điểm rất tốt. – DarenW

17

Trong trường hợp bạn đang xử lý lượng dữ liệu rất lớn, điểm cố định có thể gấp đôi hiệu quả bộ nhớ, ví dụ: một số nguyên dài bốn byte so với số tám byte. Một kỹ thuật thường được sử dụng trong các bộ dữ liệu không gian địa lý lớn là giảm tất cả dữ liệu về nguồn gốc chung, sao cho các bit quan trọng nhất có thể được xử lý và làm việc với các số nguyên điểm cố định cho phần còn lại. Điểm nổi chỉ quan trọng nếu điểm thực sự nổi, nghĩa là bạn đang xử lý một phạm vi rất rộng các con số ở độ chính xác rất cao.

+5

Nhận xét tuyệt vời về phần "nổi" của điểm nổi - thổi tâm trí của tôi mở rộng, và rất rõ ràng trong retropect. – Curyous

1

Lý do khác để sử dụng điểm cố định là ARM thiết bị, như điện thoại di động và máy tính bảng, thiếu FPU (ít nhất là nhiều thiết bị).

Để phát triển các ứng dụng thời gian thực, bạn nên tối ưu hóa các hàm bằng cách sử dụng số học điểm cố định. Có những triển khai của FFT (Fast Fourier Transform), rất importan cho đồ họa, dựa trên những cải tiến của nó về hiệu quả dựa trên số học dấu chấm động.

+0

Tôi nghĩ câu cuối cùng của bạn có nghĩa là "dựa vào số học điểm cố định". –