DIY FP - Thực hiện toán học dấu phẩy động trên vi điều khiển mà không cần phần cứng FPU


8

Tôi đang làm việc trong một dự án cá nhân nhỏ (nhắm mục tiêu vào Parallax Propeller, nhưng điều này sẽ khá khái quát) cần toán học dấu phẩy động.

Bộ điều khiển vi mô mà tôi đang làm việc không có dấu phẩy động riêng hoặc thư viện dấu phẩy động.

Có tài nguyên hay hướng dẫn tốt nào về việc triển khai phần mềm toán học dấu phẩy động không? Tốt nhất là trên các tài nguyên thực sự hạn chế (tôi thậm chí không có một ngăn xếp!).


Tôi muốn hỗ trợ doublephao có kích thước. Chân vịt là MCU 32 bit, vì vậy tôi sẽ phải sử dụng nhiều biến cho mỗi lần thả.

Tôi biết có một thư viện điểm nổi phần mềm cho cánh quạt ngoài kia, nhưng nó chỉ hỗ trợ singlecác phao có kích thước.

Không, tôi có lẽ không thực sự cần doublephao có kích thước, nhưng điều này nghe có vẻ như là một dự án thực sự thú vị. Một nửa lý do tôi muốn làm điều này là vì tôi sẽ học được rất nhiều trên đường đi.


trình biên dịch gì? Tôi có thể đã bỏ lỡ nó, nhưng tôi không thấy bạn đang sử dụng ngôn ngữ nào.
Kortuk

@Kortuk - Cá nhân tôi đang nhắm mục tiêu Parallax Propeller, vì vậy nó sẽ là Spin hoặc asm. Tuy nhiên, tôi nghĩ điều này không nên quá cụ thể về ngôn ngữ. Giả sử tôi có các hoạt động chung (+ - / * bit-shift, bitwise và / hoặc / etc ..).
Sói Connor

Những hoạt động nào bạn cần thực hiện? Nếu bạn chỉ muốn cộng, trừ và nhân, và bạn không quá lo lắng về các trường hợp cạnh, NaN, v.v., thì việc thực hiện điều này là khá nhỏ. Tôi đã thực hiện nó cho các bộ điều khiển vi mô 8 bit trong quá khứ và nó không phải là một nhiệm vụ voi ma mút, ngay cả khi bạn làm tất cả trong asm.
Paul R

1
Như bạn nói, bạn sẽ học được rất nhiều về việc triển khai các hoạt động của dấu phẩy động trên đường đi.
Paul R

3
Có lẽ bạn không cần điểm nổi . Nếu bạn chỉ cần số phân số cũng cố định số học điểm với số thập phân (nhị phân thực tế) đã dịch chuyển một số vị trí sang trái có thể làm. Bạn có thể nói thêm về ứng dụng của bạn?
Sữa đông

Câu trả lời:


4

Nếu bạn muốn tự làm điều đó, tôi muốn nói chỉ cần làm điều đó.

Tôi đoán bạn sẽ không tìm thấy quá nhiều tài nguyên hoặc hướng dẫn bởi vì nó không có nhiều.

Đây là một phác thảo:

  • cộng / trừ:
    nếu số mũ khác nhau quá nhiều (nhiều hơn số mũ có bit):
    chỉ trả về giá trị với số mũ lớn hơn (nếu đây là số phụ: phủ định)

    nếu số mũ là tương tự nhau:
    thay đổi giá trị nhỏ hơn bằng số mũ khác nhau và cộng / trừ với số mũ khác (sử dụng số học điểm cố định)
    nếu kết quả không bằng 0: dịch chuyển mantissa lên cho đến khi MSBit của kết quả là 1 và giảm số mũ

  • phép nhân / chia:
    nhân / chia mantissas (sử dụng số học điểm cố định) và cộng / trừ số mũ


2

Bạn sẽ có thể sử dụng này nhiều độ chính xác thư viện nổi-điểm trên cánh quạt, với một trong hai Catalina C hoặc gcc. Nó có thể quá chậm cho nhiều ứng dụng, tuy nhiên.


Mã C trên chân vịt có thể tương tác với Spin hoặc prop-asm không? Nếu không, tôi có thể phải dịch nó để quay. May mắn thay, tôi không cần nhiều tốc độ. Thực tế, tôi cần thực hiện 7 thao tác, ở mức 2 hz.
Sói Connor

2
Oh boy, nguồn một mình là 1,1 MB, được nén . Tôi nghĩ đó là một chút quá mức cần thiết. Có lựa chọn nào đơn giản hơn không?
Sói Connor

2
Quan trọng hơn, thư viện này (1) nói về điểm nổi chính xác tùy ý (không phải kích thước gốc như 32 bit và 64 bit) và (2) nó nhắm mục tiêu các trình biên dịch Linux trên bộ xử lý Intel, AMD và MIPS của i386 và x64. Có một đề cập về 'arm' và 'generic' trong các thư mục nguồn, nhưng tôi sẽ không bắt đầu ở đây.
Kevin Vermeer

2

Có vẻ như câu hỏi này được đưa ra để tìm kiếm sự hiểu biết nhiều hơn là giải quyết vấn đề, vì vậy đây có thể không phải là câu trả lời hữu ích nhất, mà chỉ vì sự hoàn chỉnh

http://code.google.com.vn/p/propgcc/wiki/PropGccCompileOptions

Ngụ ý rằng phiên bản cánh quạt của GCC có hỗ trợ điểm nổi, bao gồm cả nhân đôi.

GCC và các thư viện trình biên dịch của nó tất nhiên là nguồn mở, mặc dù có thể có một đường cong học tập thực sự trước khi bạn có thể bắt đầu xem những gì mã đang làm.

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.