2017-01-19 114 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 

注意:假設該變量的初始值「a」是已經在邊界(分鐘< =一個< = MAX),所以額外的初始檢查不屬於此功能。什麼讓我好奇,幾乎所有我製作的節目都需要這些功能。

的問題是:

  • 是那些歸類爲一些典型操作,並有他們的具體名稱?
  • 如果是,是否與內部處理器功能有一些對應關係,因此在某些編譯器中進行了優化?

我之所以問是純粹好奇,我當然不能在Python優化它,我知之甚少CPU架構。

更具體地講,在一個8位無符號整數水平較低的增量會看,我想是這樣的:

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任何意義如此對待它因爲我天真的嘗試想象低級代碼增加了價值。有一些細微差別,例如簽名,未簽名,但我感興趣的僅僅是無符號整數,因爲我經常遇到它。

+1

有趣的問題,讓我挖,仍然無法找到確切的答案。在http://ptgmedia.pearsoncmg.com/images/0321335724/samplechapter/seacord_ch05.pdf,從內部討論如何使用IA-32指令(jc和inc)來檢測溢出。使用GCC,您可以使用-ftrapv來發出SIGABRT並註冊一個處理程序並整理溢出。 –

+0

我得到你的問題,但只是要清楚,你不能檢測加法的結果是否大於它可以用你編寫UP函數的方式表示的最大值。考慮一個有符號整數,如果你的當前值是0x7FFFFFFE,它比最大值小1,並且你想要加2,它將會溢出併產生-2,147,483,648,它小於它可以表示的最大值。所以你永遠不會看到你的UP函數返回MAX –

回答

2

它被稱爲saturation arithmetic,它具有對DSP和GPU(不是隨機對:都處理信號)的原生支持。

例如the NVIDIA PTX ISA讓程序員或選擇當加法是飽和的未

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

.sat 限制將導致到MININT..MAXINT(沒有溢出),用於操作的大小。

TI TMS320C64x/C64x+ DSP

雙通道16位飽和算術運算

和像sadd支持指令執行專門的飽和加,甚至整個寄存器(飽和度狀態寄存器)在執行一系列指令時收集有關飽和度的精確信息。

即使是主流的x86也支持飽和,指令如vpaddsb和類似(包括轉換)。

另一個示例是GLSL clamp function,用於確保顏色值不超出範圍[0,1]。

一般來說,如果架構必須針對信號/媒體處理進行優化,那麼它就支持飽和算法。

更爲罕見的是對任意邊界的飽和度的支持,例如,不對稱邊界,兩個邊界的非冪次,非字大小邊界。

但是,飽和度可以很容易地作爲min(max(v, b), B)其中v是不飽和的(和未溢出)操作的結果,b下界和上限實現。因此,任何支持在沒有分支的情況下查找最小值和最大值的體系結構都可以有效地實現任何形式的飽和。

另請參閱this question瞭解更多如何實現飽和添加的實例。


作爲一個方面說明的默認行爲是環繞:8位量的總和255 + 1等於0(即,操作是模2 )。

+0

謝謝,是的,我正在尋找任意的界限。現在我知道正確的條款谷歌。 –