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

谢谢,是的,我正在寻找任意的界限。现在我知道正确的条款谷歌。 –