分母存在,并找到分母小于给定最大值的最近的分数。但是没有明显的方法来限制分子。
什么是最好的方式也限制分子?(即找出分子和分母都小于给定最大值的最接近的分数。)
(目标:我还需要将分子限制为2**32,因为TIFF文件将分数存储为两个无符号32位整数。)
一种粗糙的方法(可能找不到真正最接近的部分):
from fractions import Fraction
def limit_32bit_rational(f: float) -> Fraction:
ndigits = 15
while True:
r = Fraction.from_float(f).limit_denominator(1000000)
if r.numerator < 2**32:
return r
f = round(f, ndigits)
ndigits -= 1是否有更好的方法来找到最接近的分数,其命名数和分母小于2**32?
发布于 2021-05-18 12:56:14
您可以使用float.as_integer_ratio()方法获取任何浮点数的分子和分母:
f = 2345.245624
numerator, denominator = (f).as_integer_ratio()
print("Numerator", numerator)输出:
2578624833578781编辑:
您可以尝试使用if语句来检查分子或分母是否大于2 ** 32;如果是的话,将它们乘以一个比例尺,并将它们舍入最接近的整数:
def limit_32bit_rational(f):
numerator, denominator = (f).as_integer_ratio()
max_num = 2 ** 32
if numerator > max_num or denominator > max_num:
scale = max_num / max(numerator, denominator)
return round(numerator * scale), round(denominator * scale)
return numerator, denominator发布于 2022-03-30 15:07:38
您还可以翻转分数并调用limit_denominator来限制分子,并再次将结果翻转回来:
def limit_32bit_rational(f: float) -> Fraction:
tmp = Fraction(f).limit_denominator(0xFFFF_FFFF)
if tmp.numerator <= 0xFFFF_FFFF:
# makes sure we don't flip if numerator is 0
return tmp
else:
# flip numerator with denominator to limit the inputs numerator
tmp = Fraction(numerator=tmp.denominator, denominator=tmp.numerator).limit_denominator(0xFFFF_FFFF)
return Fraction(numerator=tmp.denominator, denominator=tmp.numerator)https://stackoverflow.com/questions/67586576
复制相似问题