On Sat, Jul 4, 2020, at 15:57, [email protected] wrote:
> > Simplifying the signature, in Python we have:
> >
> > def min(*iterable):
> > iterator = iter(iterable)
> > minimum = next(iterable)
> > for item in iterator:
> > if item < minimum:
> > minimum = item
> > return minimum
> >
> > Due to this, min(0, float('nan')) == 0 and same for max. I would hence
> > expect clamp to behave similarly.
>
> Yuck: We also have min(float('nan'), 0) == float('nan').
>
> I'm not sure what I'd expect a hypothetical clamp function to do.
> Someone with actual use cases will have more insight.
IEEE 754-2019 defines minimum and maximum functions that return NaN in all
cases, and apply a strict ordering to signed zero... however, there is also a
minimumNumber and maximumNumber which returns the number if the other operand
is NaN [the asymmetric behavior depending on the order of the operands isn't
allowed by either]
it might be worthwhile to define a "min2" etc that applies the rules for one of
these functions when both arguments are floats [and possibly when one argument
is a float and the other is any numeric type], and then define min(*iterable)
as:
def min(*iterable):
iterator = iter(iterable)
minimum = next(iterable)
for item in iterator:
minimum = min2(minimum, item)
return minimum
I can't find anything about a clamp-like function in IEEE.
It may be worth surveying what other implementations do... to start with:
- Rust has a clamp function that returns NaN if the given number is NaN, and
"panics" if either boundary is NaN.
- Numpy's clip function effectively accepts NaN or None boundaries as "don't
care"
- - This appears to be implemented as min(max(x, a), b), with min and max
themselves having the asymmetric behavior.
- C++'s clamp function seems to be undefined if any of the operands are NaN
- - T must meet the requirements of LessThanComparable in order to use
overloads (1).
- - However, if NaNs are avoided, T can a be floating-point type.
_______________________________________________
Python-ideas mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at
https://mail.python.org/archives/list/[email protected]/message/HUJFXYVWWZRNQVM7SAJY2MS3TFFC5P3Y/
Code of Conduct: http://python.org/psf/codeofconduct/