On Mon, 13 Jan 2020 at 19:42, Richard O'Keefe <rao...@gmail.com> wrote:
> You say that the first two results are wrong. > No. The first two results are *exactly* what they are supposed to be. > Floating point arithmetic is NOT mathematical real arithmetic. > The floating point *numbers* are exact rational numbers of the form > n * 2^k where n is a (bounded) integer and k is a (bounded) integer. > If you enter a number that is not of this form (and within bounds) > you will get a *different* number that *is* of that form and is close. > The floating point *operations* in IEEE arithmetic are exact > when and only when the result is a number of that form (and within > bounds), otherwise the result is *approximate*. > > If you want exact arithmetic on numbers of the form n * 10^k, > ANSI Smalltalk provides the ScaledDecimal class, which, sigh, > How could this be improved? > Squeak and Pharo interpret as "rational number *printed* in > decimal form but not *computed* using decimal arithmetic" > I'm interested to understand what is the benefit of doing it this way. Anyone know history of it? cheers -ben , so > that can give extremely confusing results too. > > So what you are going to have to do is use rational numbers, > which are in Smalltalk the union of Integer and Fraction. > > > On Mon, 13 Jan 2020 at 09:13, Donald Howard <dhow...@objectguild.com> > wrote: > >> Hello everyone, >> >> This is an issue I've had awareness of going way back but it's the first >> time I've had to personally deal with it. I've done some research and >> found it addressed in a number of ways but given current time pressures and >> a huge list of to-dos, I thought I'd turn to the community for rapid advice >> to get me over the hump. The circumstances are summarized below in code >> and comments suitable for a playground. >> >> "This is the actual arithmetic I want to do... >> 0.09560268 - 0.005 = 0.09060268" >> >> "Evaluate this in a playground and you'll see this is what >> floating point arithmetic produces --the first two are wrong, every one >> after is correct" >> 0.09560268 - 0.005 "=> 0.09060267999999999". >> 0.0956026 - 0.005 "=> 0.09060259999999999". >> 0.095602 - 0.005 "=> 0.090602". >> 0.09560 - 0.005 "=> 0.0906". >> 0.0956 - 0.005 "=> 0.0906". >> 0.095 - 0.005 "=> 0.09". >> >> "This workaround works" >> 0.09560268 - 0.005 roundTo: 0.00000001 "=> 0.09060268". >> "but one has to compute number of digits of precision >> and according to study above, it's not necessary at >> precisions >= 0.000001" >> >> "What are other suggestions, workarounds or approaches community has?" >> "THANKS!" >> >> >> Don Howard >> >> <https://objectguild.com> >> *Founding Member* >> dhow...@objectguild.com >> +31653139744 >> (US) 651-253-7024 >> >