2017-01-25 22 views
0

2つの引数(int32_t)を乗算して飽和させ、int32_tも返す関数を書く必要があります。内部のすべては、int32_tの範囲内でカウントする必要があります。アンダー/オーバーフローをint32_tに乗算すると、結果のミューズはINT32MAXとINT32MINで飽和します。2つのint32_t引数を乗算(飽和)する関数

私の解決策は以下の通りである:それは私が分裂はここに非常に高価であることを言うだろう

int32_t multiple_or_saturate(int32_t a, int32_t b) 
{ 
    if(((a >= 0) && (b >= 0)) || ((a < 0) && (b < 0))) 
    { 
    if((INT32_MAX/a) >= b) 
    { 
     return(a * b); 
    } 
    else 
    { 
     return(INT32_MAX); 
    } 
    } 
    else 
    { 
    if((INT32_MIN/a) <= b) 
    { 
     return(a * b); 
    } 
    else 
    { 
     return(INT32_MIN); 
    } 
    } 
} 
+0

あなたが直面している問題はなんですか? –

答えて

0

を持っています。乗算の結果を64ビット変数に格納し、結果を確認して必要に応じて飽和させる方が効率的です。

一部のコンパイラでは、飽和演算のためのMMX組み込み関数の使用もサポートされています。たぶんアセンブラ命令があります(もちろん、ハードウェアに依存します)、それを使用することを知っているコンパイラを使用するだけです。

+0

不幸にも私たちのプロセッサは64ビットのデータ型をサポートしていません。 – JanzOndrikovic

関連する問題