Ian Kelly wrote: > On Sat, Jan 17, 2015 at 7:26 AM, Steven D'Aprano > <steve+comp.lang.pyt...@pearwood.info> wrote: >> I don't understand why they add the error tolerances together. I can >> understand taking the minimum, or the maximum: > > The usual idea is that the tolerance is calculated as a relative > value, but an absolute tolerance is used instead when the values get > close to zero, so under normal circumstances the relative tolerance > will dominate and the absolute tolerance will be very small in > comparison.
That suggests that approx_equal() should return True if the actual error is smaller than *either* the absolute or relative error, that is, using the maximum. > So why add them instead of taking the maximum? I'm not > sure, but I would guess it's probably for efficiency. Determining the > maximum requires the CPU to perform a conditional branch that a simple > addition does not. That's... horrible. "Tell me whether these two numbers differ by at most X or Y%." "Oh, that would take a nanosecond longer than I think is reasonable, so I'm instead going to tell you whether they differ by some arbitrary Z instead." I'm guessing that can only have come from the mindset of C/C++ programmers, where this sort of thing is considered acceptable: http://blogs.msdn.com/b/oldnewthing/archive/2014/06/27/10537746.aspx :-) > In any case, this is not unique to numpy. See > e.g.: > > https://books.google.com/books?id=CbH0AwAAQBAJ&pg=PA164 > (equation 8.26) Ah, well as soon as you start using GPUs for numerical computation, you're already living in a state of sin. GPU's attitude to numerical correctness is best described as "meh, close enough". Seriously, anyone familiar with the horrible state of numeric computing prior to IEEE-756 surely cannot look at GPU numerics without having flashbacks to the bad old days where: if x != 0: y = 1/x could crash with a divide by zero! [...] >> * taking the minimum is equivalent to the rule "numbers are close if they >> differ by no more than BOTH the absolute tolerance AND the relative >> tolerance". > > This is generally not the desired semantic, and it's not unheard of to > pass 0 for one of the tolerances, in which case the minimum would > clearly be incorrect. True. In that case, you would have to treat 0 as a special case, which starts getting messy. -- Steven -- https://mail.python.org/mailman/listinfo/python-list