"Peter J. Holzer" <hjp-pyt...@hjp.at> writes: > On 2021-09-05 03:38:55 +1200, Greg Ewing wrote: >> If 7.23 were exactly representable, you would have got >> 723/1000. >> >> Contrast this with something that *is* exactly representable: >> >> >>> 7.875.as_integer_ratio() >> (63, 8) >> >> and observe that 7875/1000 == 63/8: >> >> >>> from fractions import Fraction >> >>> Fraction(7875,1000) >> Fraction(63, 8) >> >> In general, to find out whether a decimal number is exactly >> representable in binary, represent it as a ratio of integers >> where the denominator is a power of 10, reduce that to lowest >> terms, > > ... and check if the denominator is a power of two. If it isn't (e.g. > 1000 == 2**3 * 5**3) then the number is not exactly representable as a > binary floating point number. > > More generally, if the prime factorization of the denominator only > contains prime factors which are also prime factors of your base, then > the number can be exactle represented (unless either the denominator or > the enumerator get too big). So, for base 10 (2*5), all numbers which > have only powers of 2 and 5 in the denominator (e.g 1/10 == 1/(2*5), > 1/8192 == 1/2**13, 1/1024000 == 1/(2**13 * 5**3)) can represented > exactly, but those with other prime factors (e.g. 1/3, 1/7, > 1/24576 == 1/(2**13 * 3), 1/1024001 == 1/(11 * 127 * 733)) cannot. > Similarly, for base 12 (2*2*3) numbers with 2 and 3 in the denominator > can be represented and for base 60 (2*2*3*5), numbers with 2, 3 and 5.
Very grateful to these paragraphs. They destroy all the mystery. -- https://mail.python.org/mailman/listinfo/python-list