fraction.Fraction.limit_denominator ada, dan menemukan pecahan terdekat yang memiliki penyebut lebih kecil dari maksimum yang diberikan. Tetapi tidak ada cara yang jelas untuk membatasi pembilangnya.

Apa cara terbaik untuk juga membatasi pembilang? (Misalnya untuk menemukan pecahan terdekat yang pembilang dan penyebutnya lebih kecil dari nilai maksimum yang diberikan.)

(Tujuan: Saya perlu membatasi pembilang juga menjadi 2**32, karena file TIFF menyimpan pecahan sebagai dua bilangan bulat 32-bit yang tidak ditandatangani.)

Pendekatan kasar (yang mungkin tidak menemukan fraksi paling dekat yang sesungguhnya):

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

Apakah ada cara yang lebih baik untuk menemukan pecahan terdekat yang memiliki penyebut dan penyebut kurang dari 2**32?

1
Peter 18 Mei 2021, 15:51

1 menjawab

Jawaban Terbaik

Anda dapat menggunakan metode float.as_integer_ratio() untuk mendapatkan pembilang dan penyebut float apa pun:

f = 2345.245624
numerator, denominator = (f).as_integer_ratio()
print("Numerator", numerator)

Keluaran:

2578624833578781

EDIT:

Anda dapat mencoba menggunakan pernyataan if untuk memeriksa apakah pembilang atau penyebutnya lebih besar dari 2 ** 32; jika demikian, kalikan masing-masing dengan skala dan bulatkan ke bilangan bulat terdekat:

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
1
Ann Zen 18 Mei 2021, 15:50