On Thursday, February 27, 2014 10:24:23 AM UTC-6, Oscar Benjamin wrote:

>>>> from decimal import Decimal as D
> >>> D(0.1)
> Decimal('0.1000000000000000055511151231257827021181583404541015625')
> 

hi Oscar,  well,  that's not what I'm doing with my  D()...  I'm not just 
making D() mimic Decimal... look inside it...  there's a  str()  call....   
consider the following experiment and you'll see what I'm talking about...

Decimal does not keep  0.1  as a  floating point format (regardless of size) 
which is why banking can use Decimal without having to worry about the floating 
formatting issue...  in other words,  0.0 is not stored in Decimal as any kind 
of floating value...  its not rounded.... it really is   Decimal('0.1').

Ok, so for the experiment:   consider this exchange from IDLE:

>>> ==================== RESTART ==
>>> from dmath import *
>>> pi = D(piagm(32))
>>> pi
Decimal('3.14159265358979323846264338327950')
>>> pi * Decimal(.1)
Decimal('0.31415926535897934128560682837111')
>>> 
>>> pi * D(.1)
Decimal('0.31415926535897932384626433832795')
>>> 
>>> 

You will notice that   Decimal(.1)  and  my  D(.1)  work against  PI  
differently... in fact, Decimal(.1) decimates PI....   <sorry for the PUN>

The reason is that Decimal(.1) stores the erroneous float in the Decimal object 
including the float error for  .1    and   D(.1)  works correctly  because the 
D(.1) function in my dmath.py first converts the .1 to a string value before 
handing it to Decimal's constructor(s)

Now, try this experiment:    again from IDLE and dmath.py

>>> ===================== RESTART =
>>> from dmath import *
>>> pi = D(piagm(32))
>>> pi
Decimal('3.14159265358979323846264338327950')
>>> 
>>> pi * Decimal(str(.1))
Decimal('0.31415926535897932384626433832795')
>>> 
>>> pi * D(.1)
Decimal('0.31415926535897932384626433832795')
>>> 

You see?   All of my functions make certain that when the Decimal objects are 
created that the string constructor gets called....   so that, in this case,   
.1  really is  0.1   precisely, not floating format.

and take a look at this:

>>> ================ RESTART ==
>>> from dmath import *
>>> D(.1)
Decimal('0.1')
>>> 

With my dmath  D()  function the object holds  0.1  precisely...   its not the 
float 0.1 rounded ...


shifting gears a bit....

The real reason I pushed a commit of a gzip tarball to code.google is because 
I've never used code.google before (thought I'd give it a try) and I didn't 
realize that its only pull / download is a ZIP...  so I am going to take your 
advice and remove the tarballs and just put the code up there... if I can get 
my GIT to work ... its GIVing me fits (probably because I don't have it 
configured right on this system.

Thanks for the discussion...  its helping me get this stuff into my brain, and 
its giving me a chance to discuss what's at issue between floats and Decimal.

kind regards,
marcus
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to