On 2021-09-05, Peter J. Holzer <hjp-pyt...@hjp.at> wrote: > 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).
And once you understand that, ignore it and write code under the assumumption that nothing can be exactly represented in floating point. If you like, you can assume that 0 can be exactly represented without getting into too much trouble as long as it's a literal constant value and not the result of any run-time FP operations. If you want to live dangerously, you can assume that integers with magnitude less than a million can be exactly represented. That assumption is true for all the FP representations I've ever used, but once you start depending on it, you're one stumble from the edge of the cliff. -- Grant -- https://mail.python.org/mailman/listinfo/python-list