2017-01-19 14 views
0

私はPythonを使用しているので、Pythonで例を挙げますが、質問はPythonに関するものではありません。 変数を特定の値でインクリメントして、指定された境界にとどまるようにしたいとします。境界内のインクリメントまたはデクリメント

def up (a, s, Bmax): 
    r = a + s 
    if r > Bmax : return Bmax 
    else : return r 

def down (a, s, Bmin): 
    r = a - s 
    if r < Bmin : return Bmin 
    else : return r 

注:

だからインクリメントとデクリメントのために私は、これらの二つの機能を持っている変数の初期値は「」境界内にすでに存在することを想定しているので(<は< =最大に=分)追加の初期チェックはこの機能に属しません。私が作ったほとんどすべてのプログラムには、これらの機能が必要です。

質問です:

  • は、いくつかの典型的な操作として分類されるものであり、彼らの特定の名前を持っていますか?
  • はいの場合、固有のプロセッサ機能に対応しているので、一部のコンパイラで最適化されていますか?

私はを尋ねる理由は、もちろん、私はPythonでそれを最適化することができないと私はCPUアーキテクチャについて少し知っている、純粋な好奇心です。ので、それを扱う

def up (a, s, Bmax): 
    counter = 0 
    while True: 
     if counter == s : break 
     if a == Bmax : break 
     if a == 255 : break 
     a += 1 
     counter += 1 

私は後者はPythonでどんな意味がありません知っている:増分は私はこのような仮定になり、符号なし8ビット整数のためのより低いレベルで、より具体的には

値を追加する低レベルのコードを想像する私の素朴な試みです。いくつかのニュアンスがあります。署名された、署名されていないが、私はより頻繁にそれを見つけたので、私は単に符号なしの整数に興味があった。

+1

興味深い質問は、私が掘って、まだ正確な答えを見つけることができませんでした。 http://ptgmedia.pearsoncmg.com/images/0321335724/samplechapter/seacord_ch05.pdfでは、IA-32命令(jcおよびinc)を使用してオーバーフローを検出する方法について説明しています。 GCCでは、-ftrapvを使ってSIGABRTを発行し、ハンドラを登録してオーバーフローをソートすることができます。 –

+0

質問がありますが、明確にするために、加算の結果がUP関数をコーディングした方法で表現できる最大値よりも大きいかどうかを検出することはできません。符号付きintとみなし、現在の値がMAXより小さい1つの0x7FFFFFFEで、2を加算したい場合、オーバーフローし、-2,147,483,648になります。これは、表現できる最大値よりも小さくなります。だからあなたはあなたのUP関数がMAXを返すことを決して見ないでしょう –

答えて

2

saturation arithmeticと呼ばれ、DSPとGPUでネイティブサポートしています(ランダムペアではなく、両方とも信号を扱います)。例えば

add.type  d, a, b; 
add{.sat}.s32 d, a, b;  // .sat applies only to .s32 

.sat添加が飽和している場合、プログラマが選択しましょうか

the NVIDIA PTX ISA制限は動作の大きさMININT..MAXINT(オーバフローなし)に生じます。

TI TMS320C64x/C64x+ DSPは専用飽和ADDとも全体レジスタ(飽和ステータスレジスタ)を実行する

デュアル16ビットの飽和演算

saddような命令をサポートしてい一連の命令を実行しながら彩度に関する正確な情報を収集することに関する。

でも主流のx86は、vpaddsbなどの命令(変換を含む)で飽和をサポートしています。

もう1つの例はGLSL clamp functionで、色の値が[0、1]の範囲外でないことを確認するために使用されます。

一般に、信号/メディア処理用にアーキテクチャを最適化する必要がある場合は、飽和演算をサポートしています。

任意の境界での彩度のサポートは非​​常にまれです(例:非対称の境界、2つの境界の非累乗、非ワードの境界。

しかし、飽和が下限とB上限Vは、不飽和(及びオーバーフローしない)演算の結果であるmin(max(v, b), B)Bとして容易に実現することができます。
ブランチのない最小値と最大値を見つけることをサポートするアーキテクチャであれば、どのような形式の飽和も効率的に実装できます。

this questionも参照してください。飽和加算がどのように実装されているかのより実際の例です。サイドノートとして


デフォルトの動作は、ラップアラウンドである:8ビット量の和のために+ 1 255(すなわち操作は、モジュロ2 である)0に等しいです。

+0

ありがとう、はい私は任意の境界を探していました。そして今私はgoogleに正しい言葉を知っている。 –

関連する問題