On 5/11/14 11:10 PM, Mark H Harris wrote:
On 5/11/14 10:10 PM, Dave Angel wrote:
On 05/11/2014 02:54 PM, Mark H Harris wrote:
>julia> sin(BigFloat(π/4))
> 7.0710678118654750275194295621751674626154323953749278952436611913748
> 20215180412e-01 with 256 bits of precision
That answer doesn't seem to come anywhere near 256 bits of precision.
Using Python 3.2,
>>>
x=70710678118654750275194295621751674626154323953749278952436611913748
>>> x*x
4999999999999999693838300213161705693483516931249926767981110058185818806614907837502621065882204197129973479350206261627418690991407504
Not that this is surprising, but it does make a terrible ad for how
great Julia is.
Dave, you get the golden egg! I expected D'Aprano to catch it first!
Yes, BigFloat does the same dumb thing Python's Decimal does. π/4 is
not a BigFloat, and BigFloat simply makes the 16 digit float into a 256
bit float, the sin of which will only be 16 digits accurate (more or less).
It has nothing to do with the language (Python vs. Julia) it has to do
with the way the BigFloat is formed. So let's fix it by forming the π
constant as a BigFloat constant:
>julia> n = BigFloat(1)
>1e+00 with 256 bits of precision
>julia> π = atan(n/5)*16 - atan(n/239)*4
>3.141592653589793238462643383279502884197169399375105820974944592307816406286198e+00
>with 256 bits of precision
>julia> S = sin(π/4)
>7.07106781186547524400844362104849039284835937688474036588339868995366239231051e-01
>with 256 bits of precision
>julia> S * S
>4.999999999999999999999999999999999999999999999999999999999999999999999999999957e-01
>with 256 bits of precision
Having said that, the accuracy was not my point; in the first place. My
point is that the sin() function is built-in, takes standard floats (32
bit, 64 bit, 128 bit) and BigFloats of arbitrary precision (and does
something meaningful with it). Let's take a look at Python Deciaml:
>>> =================== RESTART ===============
>>> from decimal import * (first I have to import)
>>> from math import * (than I have to import again)
>>> π
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
π
NameError: name 'π' is not defined (whoops, don't know π )
>>> π=4*atan(1) (let's create it)
>>> sin(Decimal(π/4))
0.7071067811865475 (whoops sin doesn't do Decimals)
>>> from pdeclib import sin (let's get a sin that does do Decimals)
>>> sin(Decimal(π/4))
Decimal('0.707106781186547502751942956217516746261543')
>>> S=sin(Decimal(π/4)) (Whoops has the same problem as BigFloat)
>>> S**2
Decimal('0.499999999999999969383830021316170569348351')
>>>
Now let's fix it:
>>>
>>> from pdeclib import d
>>> n=d(1)
>>> from pdeclib import *
>>> n=d(1)
>>> π=atan(n/5)*16 - atan(n/239)*4
>>> S=sin(π/4)
>>> S**2
> Decimal('0.500000000000000000000000000000000000000000')
>>>
Also not bad, but slower. ;-)
marcus
--
https://mail.python.org/mailman/listinfo/python-list