부호가있는 변환에 대한 통찰력이 필요합니다.고정 소수점 <-> 배정 밀도
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로 인쇄하려면 어떻게해야합니까?