你應該如何在C代碼中實現這個功能?C編程類型鑄造和定點
U16 newValue function(U16 value, S16 x, U16 y){
newValue = min((((value - x) * y) >> 10) >> 4, 4095)
return newValue
}
y是用10個分數位
如果x大於值固定點的最終結果應該是0
我擔心的是特別不同類型之間的組合,並且溢出不會發生。另外如何寫在乾淨的爲什麼如果會有很多類型轉換。
你應該如何在C代碼中實現這個功能?C編程類型鑄造和定點
U16 newValue function(U16 value, S16 x, U16 y){
newValue = min((((value - x) * y) >> 10) >> 4, 4095)
return newValue
}
y是用10個分數位
如果x大於值固定點的最終結果應該是0
我擔心的是特別不同類型之間的組合,並且溢出不會發生。另外如何寫在乾淨的爲什麼如果會有很多類型轉換。
您需要在輸入中給出的參數的所有可能值的代碼的溫控功能。採取表達式(value - x)
。如果value
等於2^16並且x
等於2 ^( - 15),那麼(value - x)
的結果將是98304,大於U16
。因此,在此操作之前,我會將value
轉換爲S32
。
讓摺疊表達(value - x)
到其最大值98304.則表達式((value - x) * y)
的最大值將是98304 * 2^16,其等於6442450944,這比32位整數可以容納更大的值。因此,您需要將此表達式計算爲U64
。您可以簡單地將初始U32
演員替換爲S64
演員,因爲無論如何您都需要演員。
右移位操作僅減少有效位的數量。因此,這不需要計算更多的位數。
min
調用確保結果不能大於4095,可以保存在U16
;沒有更多的演員應該是必要的。
最終功能:
uint16_t newValue(uint16_t value, int16_t x, uint16_t y){
int64_t newValue = (int64_t)(value);
newValue -= x;
newValue *= y;
newValue >>= 10;
newValue >>= 4;
newValue = min(newValue, 4095);
// Or as a one liner.
// uint64_t newValue = min(((((int64_t)value - x) * y) >> 10) >> 4, 4095);
return (uint16_t) newValue;
}
謝謝。但是在乘以y之後會發生什麼,這是固定點? 「>> 10」移位是在定點乘法之後截斷小數部分。 – Perry
一切都是固定點,那裏沒有浮子,是嗎? – sturcotte06
y輸入是固定點,有10個小數位,我必須用y乘以10後右移結果以截斷小數部分。我認爲這對於unsigned int沒有問題,但不知道當你用帶符號的int來做這件事時會發生什麼。 – Perry
這
unsigned int function(unsigned int value, signed int x, unsigned int y){
if((((value - x) * y) >> 10) >> 4<4095)
return (((value - x) * y) >> 10) >> 4;
else return 4095;
}
我沒有得到你的解決方案,解釋它。 –
告訴我哪一條線在困擾你? –
第二和第三行 –
你從你的代碼片段中,'min'功能指的是功能? – Sitram
請提供清晰正確的代碼(可能是僞代碼)。在這裏,我們錯過了所有的上下文。它應該是C嗎?如果是,那麼問題是什麼?什麼是'U16','min'? –
@JensGustedt我們都是開發人員,我想我們都可以推斷'U16'和'min'的含義。 – sturcotte06