可以使用^{} module检查给定分数是否可以表示:from fractions import Fraction
def can_be_represented(num, den):
f = Fraction(num, den)
return Fraction.from_float(float(f)) == f
因为浮点数使用二进制分数,您很快就会发现,这可以简化为检查分母的二次幂:
^{pr2}$
但是,这不会对分子进行任何边界检查,请通过与^{}中的信息进行比较来添加边界检查:
^{3}$
以上版本测试:分母是2的幂
分子二元指数可以表示
分子中包含重要信息的部分可以进行移位以适应浮点的尾数。在
上述优化但可读性较差的版本是:def can_be_represented(num, den,
_mexp=sys.float_info.max_exp,
_mdig=sys.float_info.mant_dig):
f = Fraction(num, den)
num, den = f.numerator, f.denominator
numbl = num.bit_length()
return (
# denominator is a power of 2
den & (den - 1) == 0 and
# numerator exponent can be represented
numbl <= _mexp and
# numerator significant bits can be represented without loss
(numbl <= _mdig or num << numbl - _mdig >> numbl - _mdig == num)
)