SV: [Python-Dev] Comparing heterogeneous types
Anders J. Munch
ajm at flonidan.dk
Thu Jun 3 05:35:29 EDT 2004
Chermside, Michael wrote:
>
> The only bit that seems tricky to me is determining the crossover
> value in pure C. How do we do that?
I think that's as simple as pow(FLT_RADIX, DBL_MAX_DIG).
So the comparison would go something like:
def cmp_floatvlong_positive(afloat, along):
assert afloat >=0 and along >= 0
if along < FLT_RADIX**DBL_MANT_DIG:
# the long is representable as float
return cmp(afloat, float(along))
elif afloat >= FLT_RADIX**DBL_MANT_DIG:
# the float is representable as integer
return cmp(long(afloat), along)
else:
# At this point we know: afloat < FLT_RADIX**DBL_MANT_DIG <= along
return -1
def cmp_floatvlong(afloat, along):
ures = cmp_floatvlong_positive(abs(afloat), abs(along))
if (afloat >= 0) != (along >= 0):
return -ures
else:
return ures
Assuming FLT_RADIX is a power of 2, comparing the long to the
crossover value can be implemented by counting bits of magnitude,
replacing
if along < FLT_RADIX**DBL_MANT_DIG:
with
if trunc(lg(along)) < lg(FLT_RADIX)*DBL_MANT_DIG:
The crossover value as a float can be (pre-)computed the
straightforward way: pow(FLT_RADIX, DBL_MAX_DIG) will always be exact
representable.
- Anders
More information about the Python-Dev
mailing list