![]() |
Một câu hỏi về tính toán với kiểu dữ liệu fractional trong dspic.
Hi,
Giả sử em khai báo 3 biến a1, b1, c1 kiểu fractional 3 biến a2, b2, c2 kiểu float. Lưu giá trị thu được từ ADC (định dạng fractional) vào 2 biến a1 và b1 Thực hiện câu lệnh : Code:
a2=Fract2Float(a1); Tiếp theo em thực hiện : Code:
c1=a1*b1; Mong sự giúp đỡ của mọi người. Cảm ơn rất nhiều. |
Trích:
Thân, |
Cảm ơn anh Nam,
Em đã thử và kết quả là không đúng. Chắc có lẽ vì khi thực hiện 2 phép nhân kiểu Float thì giá trị phải lưu ở dạng 32bits trong khi đó kiểu Float chỉ lưu 16 bits. Như vậy muốn thực hiện phép nhân 2 số hạng kiểu Fractional, trước tiên phải đổi sang Float trước sau đó mới nhân 2 số Float đó rồi đổi kết quả từ Float sang Fractional lại mới chính xác được. |
Mình đã tìm trên mạng 1 tài liệu và nó đã chỉ cho cách thức giải quyết vấn đề trên như sau:
- Lấy 2 số fractional a1*a2 được kết quả là 1 số 32 bits. - Nhân kết quả trên với 0x2 - Kết quả chính xác dạng fractional của phép nhân trên sẽ là 16 bits cao nhất của kết quả sau khi nhân với 0x2. Ví dụ : Code:
Ta có : a1=0.5 lưu theo dạng fractional là 0x4000 |
Nhân hai số ở format 1.15 sẽ được một số ở format 2.30. Nhân 0x2 tức là dịch trái 1 bit sẽ cho kết quả ở format 1.31. Chỉ lấy 16 bit cao nhất sẽ cho kết quả ở format 1.15.
Thân, |
Múi giờ GMT. Hiện tại là 08:17 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam