Lý lịch
Có ai ở đây là một EE có kinh nghiệm lập trình đã làm việc với DSP TMS320 C3X-series của Texas không? Tôi hiện đang làm một số công việc với C3X cho một dự án. Mục tiêu của tôi ở đây là chuyển đổi các giá trị thập lục phân của dấu phẩy động có định dạng C3X thành định dạng IEEE 754. Mã mà tôi có hoạt động đúng cho:
Trong đó x là số hex hex của dấu phẩy động đơn đầu vào (được biểu thị dưới dạng UInt32).
Vấn đề là khi tôi cố gắng sử dụng một số như 0.123 . Dường như tôi luôn nhận được giá trị NaN . Tôi hiện đang sử dụng đoạn mã này từ Đại học Florida mà tôi đã chuyển sang C #.
Thủ tục
- Hoán đổi các dấu hiệu và trường số mũ để đi từ C3X sang IEEE. Tôi sẽ không hiển thị mã này (trừ khi được hỏi) vì tôi tin rằng nó rất đơn giản cho bất kỳ ai đã làm việc với DSP này.
- Thực hiện thuật toán của Đại học Florida (được liên kết ở trên), mà tôi tin rằng tôi không hiểu đầy đủ.
- Kết hợp các dấu hiệu, số mũ và mantissa thành điểm nổi IEEE 754 có độ chính xác đơn.
Thực hiện C #
Dưới đây là mã được sử dụng để thực hiện thuật toán khi số float của C3X nằm trong khoảng từ 0 đến 1 (trong đó sự cố đang xảy ra). Đối c30
tượng, đại diện cho số dấu phẩy động C3X. Đối ieee
tượng đại diện cho số dấu phẩy động IEEE 754.
EDIT: Theo yêu cầu phổ biến, đây là một mẫu mã không tệ. Mẫu này là phiên bản hoạt động chính xác nơi chúng tôi kết xuất trong 15.913,35 ... (dưới dạng thập lục phân C3X).
C30Float c30 = null;
UInt32 bias = 127;
Int32 mantissa = 0;
Int32 digit = 0;
double fraction = 0;
double exponent = 0;
double fpValue = 0;
double sign = 0;
// 1. Declare the new C3X floating point value.
c30 = new C30Float(0x0D78A56B);
// 2. Get the sign bit value.
sign = c30.GetSign();
// 3. Decide whether or not to do the flip.
if (sign == 1)
{
// flip
mantissa = c30.GetMantissa();
mantissa = mantissa + 1;
mantissa = (~mantissa) & 0x007FFFFF; // the first 9 bits have nothing to do with the mantissa
}
else
{
mantissa = c30.GetMantissa();
}
// 4. Obtain part of the fraction (do the swim!).
for (int i = -1; i > -24; i--)
{
// mantissa index
int currentDigit = i + 23; // n = -23 + 23 => n = 0
// shift forward (get the digit)
digit = mantissa;
digit = digit & (1 << currentDigit);
// shift back (get the digit into the lowest place)
digit = digit >> currentDigit;
// apply the digit to the fraction
fraction += digit * Math.Pow(2, i);
}
// 5. Obtain the exponential part of the number.
exponent = c30.GetExponent() + 0x7F;
// 6. Get the floating point number.
fpValue = Math.Pow(-1, sign);
fpValue *= (1 + fraction) * Math.Pow(2, exponent - bias);
Tôi biết rằng tôi chưa cung cấp các chi tiết triển khai cho các mục sau:
GetMantissa()
GetExponent()
GetSign()
hoặc là...
SetMantissa()
SetExponent()
SetSign()
Lý do cho điều này là tất cả những gì đang làm là nhập / kéo các số đến / từ các trường tương ứng của chúng như được chỉ định trong Hướng dẫn sử dụng TMS320 C3X . Ai biết được, có lẽ đó là nơi tôi đang đi sai, nhưng bây giờ tôi muốn bắt đầu ở nơi tôi nghĩ phạm vi của vấn đề bắt đầu. Nếu bất kỳ ai trong số các bạn tin rằng vấn đề không có ở đây thì hãy hỏi về việc triển khai này và tôi sẽ cung cấp thêm chi tiết như được bảo hành.
Câu hỏi
Vấn đề của tôi rõ ràng là có các số từ 0 đến 1. Vì vậy, nếu bất kỳ ai đã biết các giá trị hex của C3X và các số float / real đối tác đã biết mà tôi có thể cắm và chug sẽ rất tuyệt để tôi có thể khắc phục sự cố thuật toán này.
Lưu ý: Chúng tôi không có DSP trước mặt cho những gì chúng tôi đang làm và không thể lấy số ra.