2012-11-22 5 views
2

부호가있는 변환에 대한 통찰력이 필요합니다.고정 소수점 <-> 배정 밀도

C 루틴에 대한 입력은 -Pi에서 pi 범위에 있어야합니다. 이것은 "double"데이터 형식으로 전달됩니다.

내 장치에 FPU가 없기 때문에 24 비트 레지스터의 고정 소수점을 사용하여 입력에서 수학 (Pi로 나누기 나누기)을 수행해야합니다.

범위가 알려져 있으므로 입력 데이터를 Q3.10 형식으로 저장할 수 있습니다.

그래서 :

typedef int Q3_10; 
Q1_10 ReciProc_Pi = 0x145; 
Q3_10 FP_DataQ310 = (Q3_10)(Input_Data * 1024); /* Scale by 2^10 */ 
Q4_20 FP_DataQ420 = FP_DataQ310 * ReciProc_Pi; /* Input/Pi */ 
Q4_23 FP_DataQ423 = FP_DataQ420 << 3; /* Change 4Q20 to 4Q23 */ 
Q1_23 FP_DataQ123 = FP_DataQ423 & 0xFFFFFF; /* Retain 24 bits */ 

나는 오래된의 printf를 사용하여 분수를 인쇄 확인할 수 있어요.

따라서 입력이 2.5678 인 경우 분수는 정확하게 0.81483으로 식별됩니다.

음수가 똑같이 취급됩니까?

-1.757을 통과하면 위의 계산이 실패합니다. printf는 양의 1.442410을보고합니다. 그러나 FP_DataQ123의 16 진수 값은 allright (0xB8a0e8)로 보입니다.

Q1_23 FP_DataQ123 = FP_DataQ423 & 0xFFFFFF; /* Retain 24 bits */ 
if (FP_DataQ123 >> 23) 
    { 
    printf("Input is negative\n"); 
    FP_DataQ123 = (~FP_DataQ123) & 0x7FFFFF; /* Complement */ 
    double Fraction = (double)((double)FP_DataQ123/(65536 * 128)); 
    printf("Fraction = %f\n", Fraction); 
    } 

의 printf 지금 올바른 비율 0.557를보고하지만 마이너스 부호없는 : 부호 비트가 제대로 1.

로 설정되어 나중에 이런 짓을.

FP_DataQ123을 보완하지 않고 printf를 -0.557로 인쇄하려면 어떻게해야합니까?

답변

0

그래서 모든 정수 비트가 부호 확장되어야한다는 것이 밝혀졌습니다.

Q1_23 FP_DataQ123 = FP_DataQ423 & 0xFFFFFF; /* Retain 24 bits */ 

비트 24 비트 23이 부호 확장 될 후 1 나타내는 부정적인 1Q23 분획의 printf 필요한 모든이기 때문에 이것이 올바른 않는다.

Q1_23 FP_DataQ123 = FP_DataQ423 ; 

트릭을 수행합니다. 부호 확장을 필요로하는 이유는 24 비트가 아닌 64 비트 숫자를 인쇄해야하기 때문입니다.

0

부호가있는 정수로 (65536*128)은 음수 인 0x800000입니다. 나는 당신이 리터럴 값을 unsigned로 만들거나 두 단계로 나누어야한다고 생각한다.

관련 문제