2017-02-21 96 views
-1

你應該如何在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

我擔心的是特別不同類型之間的組合,並且溢出不會發生。另外如何寫在乾淨的爲什麼如果會有很多類型轉換。

+0

你從你的代碼片段中,'min'功能指的是功能? – Sitram

+1

請提供清晰正確的代碼(可能是僞代碼)。在這裏,我們錯過了所有的上下文。它應該是C嗎?如果是,那麼問題是什麼?什麼是'U16','min'? –

+0

@JensGustedt我們都是開發人員,我想我們都可以推斷'U16'和'min'的含義。 – sturcotte06

回答

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; 
} 
+0

謝謝。但是在乘以y之後會發生什麼,這是固定點? 「>> 10」移位是在定點乘法之後截斷小數部分。 – Perry

+0

一切都是固定點,那裏沒有浮子,是嗎? – sturcotte06

+0

y輸入是固定點,有10個小數位,我必須用y乘以10後右移結果以截斷小數部分。我認爲這對於unsigned int沒有問題,但不知道當你用帶符號的int來做這件事時會發生什麼。 – Perry

0


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; 
} 
+0

我沒有得到你的解決方案,解釋它。 –

+0

告訴我哪一條線在困擾你? –

+0

第二和第三行 –