From: kj on 24 Sep 2009 15:40 The docs for divmod include the following: divmod(a, b) ...For floating point numbers the result is (q, a % b), where q is usually math.floor(a / b) but may be 1 less than that. ... I know that floating point math can sometimes produce "unexpected" results, so the above caveat is not entirely surprising. Still, I would find it helpful to see a specific example where divmod(a, b) is equal to math.floor(a/b)-1. Does anybody know one? Thanks! kynn From: Robert Kern on 24 Sep 2009 16:55 On 2009-09-24 14:40 PM, kj wrote:> > The docs for divmod include the following: > > divmod(a, b) > ...For floating point numbers the result is (q, a % b), where q > is usually math.floor(a / b) but may be 1 less than that. ... > > I know that floating point math can sometimes produce "unexpected" > results, so the above caveat is not entirely surprising. Still, > I would find it helpful to see a specific example where > divmod(a, b) is equal to math.floor(a/b)-1. Does anybody know > one? In : a = 10.0 In : b = 10.0 / 3.0 In : divmod(a, b) Out: 2.0 In : math.floor(a / b) - 1.0 Out: 2.0 -- Robert Kern "I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth." -- Umberto Eco From: kj on 24 Sep 2009 17:15 In Robert Kern writes: >On 2009-09-24 14:40 PM, kj wrote: >> >> The docs for divmod include the following: >> >> divmod(a, b) >> ...For floating point numbers the result is (q, a % b), where q >> is usually math.floor(a / b) but may be 1 less than that. ... >> >> I know that floating point math can sometimes produce "unexpected" >> results, so the above caveat is not entirely surprising. Still, >> I would find it helpful to see a specific example where >> divmod(a, b) is equal to math.floor(a/b)-1. Does anybody know >> one? >In : a = 10.0 >In : b = 10.0 / 3.0 >In : divmod(a, b) >Out: 2.0 >In : math.floor(a / b) - 1.0 >Out: 2.0 Wow. To me this stuff is just black magic, with a bit of voodoo added for good measure... Maybe some day I'll understand it. Thanks! kynn From: Martin v. Löwis on 27 Sep 2009 02:51 >> In : a = 10.0> >> In : b = 10.0 / 3.0 > >> In : divmod(a, b) >> Out: 2.0 > >> In : math.floor(a / b) - 1.0 >> Out: 2.0 > > Wow. To me this stuff is just black magic, with a bit of voodoo > added for good measure... Maybe some day I'll understand it. I think this example is not too difficult to understand (IIUC). I'll use integer constants to denote exact real numbers and exact real operations, and the decimal point to denote floating point numbers. IIUC, the source of the problem is that 10.0/3.0 > 10/3. 10/3 is not exactly representable, so it needs to be rounded up or rounded down; the closest representable value is larger than the exact value. Therefore, (10.0/3.0)*3 > 10. So 10.0/3.0 doesn't fit three times into 10.0, but only two times; the quotient is therefore 2.0. The remainder is really close to 10.0/3.0, though: py> divmod(a,b) (2.0, 3.333333333333333) py> divmod(a,b)-b -4.4408920985006262e-16 So that explains why you get 2.0 as the quotient. Now, if you do math.floor(a / b), we first need to look at a/b. Again, 10.0/(10.0/3.0) is not exactly representable. Funnily, the closest representable value is 3.0, so the quotient gets rounded up again: py> a/b 3.0 math.floor doesn't change the value, so it stays at 3.0; qed. Regards, Martin