[Python-ideas] Consider adding clip or clamp function to math

Random832 random832 at fastmail.com
Tue Aug 2 14:45:49 EDT 2016


On Tue, Aug 2, 2016, at 14:22, Steven D'Aprano wrote:
> In any case, clamping is based of < and > comparisons, which are 
> well-specified by IEEE 754 even when NANs are included:

Sure, but what the standard doesn't say is exactly what sequence of
comparisons is entailed by a clamp function.

def clamp(x, a, b):
    if x < a: return a
    else:
        if x > b: return b
        else: return x

def clamp(x, a, b):
    if a <= x:
        if x <= b: return x
        else: return b
    else: return a

There are, technically, eight possible naive implementations, varying
along three axes:
- which of a or b is compared first
-  x < a (or a > x) vs x >= a (or a <= x)
-  x > b (or b < x) vs x <= b (or b >= x)

And then there are implementations that may do more than two
comparisons.

def clamp(x, a, b):
    if a <= x <= b: return x
    elif x < a: return a
    else: return b

All such functions are equivalent if {a, b, x} is a set over which the
relational operators define a total ordering, and a <= b. However, this
is not the case if NaN is used for any of the arguments.


More information about the Python-ideas mailing list