# Pi with arbitrary precision and mpmath

18 views

### Carlos Gouveia

Jul 21, 2019, 7:33:38 PM7/21/19
to mpmath

Hello,

Just for the love of programming, I wrote an arbitrary precision script
to compute Pi using mpmath. I'm not new to mpmath and I like this library
whole lot. This time I've got puzzling outputs, though.

The algorithm is based on the Borwein brothers' algorithm, which is quite
simple to program: With the formulae above I wrote a Python script that spits Pi with an
arbitrary precision... well, not quite. What I got was a long string
of digits such as the following (only the first five lines shown):

3.14159264621354594737567822448909282684326171875
3.1415926535897935600871733186068013310432434082031
3.1415926535897935600871733186068013310432434082031
3.1415926535897935600871733186068013310432434082031
3.1415926535897935600871733186068013310432434082031

What puzzles me is that the long numerical strings above look like Pi,
but all the digits after the 15th decimal place are wrong. This is an
iterative process that should converge quartically, and the figures
above suggest that Pi has converged after the 2nd iteration, given
the chosen precision. But it converged to the wrong number, and I
wonder why.

Here's the code I've been using:

`import mpmath as mpmp.dps  = 72mp.pretty = Trueone = mp.mpf('1.0')two = mp.mpf('2.0')four = mp.mpf('4.0')six = mp.mpf('6.0')m = -one/fourtmp = mp.mpf(0)val = mp.mpf(0)sqrt2 = mp.sqrt(two)y = sqrt2 - onea = six - four*sqrt2for k in range(0,12):    tmp = (one - mp.power(y,four))    tmp = tmp**m    y = (tmp - one)/(tmp + one)    a = a*mp.power((one + y),four) - \        y*mp.power(two,(2*k+3))*(one + y + mp.power(y,2))    val = one/a        print(mp.nstr(val,50))`

Can you spot any mistake in it? The 'algorithmization' is probably
correct, otherwise the script wouldn't yield Pi correct to fifteen
decimal places. It's something wrong I did with mpmath. But what?

Ubuntu 18.04, Python 3.6.8 and mpmath 1.1.0.

Thanks a lot for any light shed on this matter.

C.G.

### Isuru Fernando

Jul 22, 2019, 12:32:54 AM7/22/19
Hi,

You need to do,
mp.mp.dps = 72 instead of mp.dps = 72, otherwise the working precision doesn't change properly.
You can do print(mp.mp) to see the working precision.

Isuru

--
You received this message because you are subscribed to the Google Groups "mpmath" group.
To unsubscribe from this group and stop receiving emails from it, send an email to mpmath+un...@googlegroups.com.