From: Sam S. <sd...@gn...> - 2011-04-04 16:42:02
|
> * Dan Becker <qo19606@tznvy.pbz> [2011-01-09 13:54:10 -0700]: > > Well, sure, and so maybe when you read the following in the hyperspec: > >> These functions divide number by divisor, returning a quotient and remainder, such that >> >> quotient*divisor+remainder=number > > it's OK to interpret it as meaning "the two sides will be equal within > the limits of floating-point roundoff errors". On the other hand, you > could also interpret it as meaning "you will get an answer that will > always satisfy this equality", so my question is whether one > interpretation is correct or whether both are OK. Let me repeat: >> All floating point equalities should always be taken as only >> meaningful up to the rounding error. More precisely: two floats will be equal (as in "bit-by-bit" or "EQL") only in 3 cases: 1. by "accident": 1.0 + 3.0 = 2.0 + 2.0 2. if they are EQ (i.e., the same object in memory): (let ((x 1.0)) (= x x)) 3. if they have been generated by an identical process from the same inputs: (log 3) = (log 3) (float 22/7) = (float 22/7) E.g., this is correct in any IEEE-compliant system: (- 1.1 0.9) ==> 0.20000005 Moreover, if we were to somehow manage to return 0.2 there, we would have been broken. (http://docs.sun.com/source/806-3568/ncg_goldberg.html) Now, back to truncate: you cannot expect the equality you quote to be always correct in the sense of EQL, only up to a rounding error. Even if some implementations do manage to enforce that equality, they will break other conditions instead (e.g., as you observed yourself, negative numbers instead of 0). If you want to have that (and other) invariant always satisfied, you should be using exact numbers (integers and ratios). I am sorry, but that is a fact of life: A number problem "solved" with floats turns into 1.9999999999999998 problems. -- Sam Steingold (http://sds.podval.org/) on CentOS release 5.5 (Final) X http://mideasttruth.com http://dhimmi.com http://palestinefacts.org http://memri.org http://www.memritv.org http://camera.org http://truepeace.org Murphy's Law was probably named after the wrong guy. |