回答

0

當然它不工作,(1 < < 24)過大對於能夠代表存儲的24位數字,正好。爲了把這個另一種方式,1 << 24實際上是一個25位數。

考慮(units * ((1 << 24) - 1))代替。

        (1 << 24) - 1是最大的值的無符號24位整數,開始於可以代表。

現在,在範圍內的浮點數[0.0 - 1.0]將實際裝配到無溢出一個無符號的24位定點整數。

0

歸一化的定點表示意味着最大可表示值(不可嚴格可達)爲1.因此1表示爲1<<24。另見Q Formats。例如Q24表示24個小數位,0個整數位和無符號。如果使用32位無符號整數來管理Q24,則可以使用剩餘8位來簡化計算。
在從浮點轉換爲定點表示之前,您必須始終爲原始值定義範圍。例如:浮點值是從[0, 5)範圍內的物理值,所以0被包括和5不被包括在範圍內,並且您的定點值是歸一化至5

#include <string.h> 
#include <stdio.h> 

float length_flp = 4.5;  // Units: meters. Range: [0,5) 
float time_flp = 1.2;  // Seconds. Range: [0,2) 
float speed_flp = 1.2;  // m/sec. Range: [0,2.5) 
unsigned uint32_t length_fixp; // Meters. Representation: Q24 = 24 bit normalized to MAX_LENGTH=5 
unsigned uint32_t time_fixp;  // Seconds. Representation: Q24 = 24 bit normalized to MAX_TIME=2 
unsigned uint32_t speed_fixp; // m/sec. Repr: Q24 = 24 bit normalized to MAX_SPEED=(MAX_LENGTH/MAX_TIME)=2.5 

void main(void) 
{ 
    printf("length_flp=%f m\n", length_flp); 
    printf("time_flp=%f sec\n", time_flp); 
    printf("speed_flp=%f m/sec\n\n", length_flp/time_flp); 

    length_fixp = (length_flp/5) * (1 << 24); 
    time_fixp = (time_flp/2) * (1 << 24); 
    speed_fixp = (length_fixp/(time_fixp >> 12)) << 12; 

    printf("length_fixp=%d m\n", length_fixp); 
    printf("time_fixp=%d sec\n", time_fixp); 
    printf("speed_fixp = %d msec [fixed-point] = %f msec\n", speed_fixp, (float)speed_fixp/(1 << 24) * 2.5); 
} 

與優點規範化的表示是標準化值之間的操作返回規範化的值。 順便說一下,您必須爲每個操作(除法,乘法等)定義一個通用函數,以防止溢出並節省精度。 正如你所看到的,我用一個小技巧來計算speed_fixp。 輸出是

length_flp=4.500000 m 
time_flp=1.200000 sec 
speed_flp=3.750000 m/sec 

length_fixp = 15099494 m [fixed-point] 
time_fixp = 10066330 sec [fixed-point] 
speed_fixp = 25169920 msec [fixed-point] = 3.750610 msec 
+0

'x *(1 << 24)'是多餘的,它可以只是'(x)<< 24'。這是否是8:24或40:24格式,或者甚至可能在16位嵌入式系統上溢出也是模糊不清的。應該使用特定的類型,例如'uint32_t'或'uint64_t',並明確闡明(語義'typedef uint32_t uint_fixed_8_24_t')格式化特定變量在規範化之前使用*或昂貴的轉換爲double/float。 (另請參閱:[doom m_fixed.c](http://doomwiki.org/wiki/Doom_source_code_files),這在今天的編碼標準中幾乎不夠用)順便說一句:C缺省爲整數和雙精度。 – Barry

+0

由於左操作數的浮點數,不能使用'x << 24'。我已經添加了有關定點類型的更多細節,但問題顯然是在談論24位標準化值。關於平臺獨立類型的使用是絕對正確的。 – omegatre