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. hp -- _ | Peter J. Holzer | Story must make more sense than reality. |_|_) | | | | | h...@hjp.at | -- Charles Stross, "Creative writing __/ | http://www.hjp.at/ | challenge!"
signature.asc
Description: PGP signature
-- https://mail.python.org/mailman/listinfo/python-list