2017-02-21 8 views
-1

この関数をCコードでどのように実装する必要がありますか?Cプログラミング型キャストおよび固定小数点

U16 newValue function(U16 value, S16 x, U16 y){ 
    newValue = min((((value - x) * y) >> 10) >> 4, 4095) 
    return newValue 
} 

yは、xが値より大きい場合、最終的な結果は0

私の懸念は、特に異なるタイプのミックスであり、そのオーバーフローはないでなければならない10小数ビット

と固定点であります発生する。また、タイプキャストがたくさんある場合は、クリーンでそれを書き込む方法。

+0

? – Sitram

+1

まず、明確で正確なコード(擬似コード)を入力してください。ここではすべての文脈が欠けている。それはCであるはずですか?はいの場合、その質問は何ですか? 「U16」、「ミニ」とは何ですか? –

+0

@JensGustedt私たちはすべてここで開発者です。私たちはすべて、「U16」と「ミニ」の意味を推測することができます。 – sturcotte06

答えて

0

です。式(value - x)を取る。 valueが2^16に等しく、xが2 ^( - 15)に等しい場合、(value - x)の結果は、U16より大きい98304になります。したがって、この操作を行う前にvalueS32にキャストします。

((value - x) * y)の最大値は、整数を保持することができ、32ビットよりも大きい値である、6442450944に等しい98304 * 2^16であろう者がその最大値98304.に発現(value - x)を縮小してみましょう。したがって、この式をU64として計算する必要があります。とにかく最初のU32キャストをS64キャストに置き換えるだけで済みます。

右ビットシフト演算は、有効ビット数を減らすだけです。したがって、これはより大きなビット数を計算する必要はありません。

minコールでは、結果が4095より大きくならないようにします。これはU16に保持できます。もはやキャストは必要ありません。

決勝機能:あなたのコードスニペット、 `min`関数から参照ください機能

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を乗算した後に結果を右にシフトする必要があります。私はこれが無署名のintで問題はないと思うが、署名されたintでこれを行うと何が起こるのか分からない。 – Perry

0

ここでは、あなたが入力に与えられたパラメータのすべての可能な値についてfucntionをコーディングする必要が

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

2行目と3行目 –

関連する問題