Jump to content
IGNORED

Pi Day - Calculate Pi on the TI


Vorticon

Recommended Posts

2 hours ago, Vorticon said:

I let the MLC version run for a while, and it seems that the Pi value is getting stuck around the 1.427 value +/- 0.005 or so after over 119 million iterations. I wonder if this is a limitation of the RND algorithm.

The 1 million iterations trial with the XB version is still running, and I'll be curious what kind of result I will get (should be complete within the next 48hrs).

 

 

 

PI.jpg

I had a thought !

 

my RND runs from 0 to 4095 but the algorithm considers a radius of 4096. So, more points than expected are included into the 1/4 of circle.

 So PI is overestimated.

 

A change is needed!

 

Guillaume.

 

  • Like 1
Link to comment
Share on other sites

So 1 million iterations in plain XB yielded 3.1434, clearly a very very slow conversion. The MLC version gives about the same answer at 1 million iterations.

OK so now I'm going to do a trial run for 1 billion under Classic99 to see if I can gain another decimal. This will take a while :) (just kidding. This will take about 3 years to complete! I need a supercomputer cluster. On the other hand, with overdrive on in Classic 99, I might be able to bring it down to about 3.5 months. That's feasible).

 

 

PI-XB.jpg

 

xb-MLC.jpg

  • Like 3
Link to comment
Share on other sites

3 hours ago, Vorticon said:

I let the MLC version run for a while, and it seems that the Pi value is getting stuck around the 1.427 value +/- 0.005 or so after over 119 million iterations. I wonder if this is a limitation of the RND algorithm.

The 1 million iterations trial with the XB version is still running, and I'll be curious what kind of result I will get (should be complete within the next 48hrs).

 

 

Thanks to your remark, I made two changes in the MLC program:

1) the correct divisor to tranform 4095^2 into 32768 is... 4095^2/32768. This one is sent via CALL LINK to the INITSQ routine

2) the internal routine in MLC that turns a float into an integer does only work from -32768 to +32767. But the last value was +32768 leading to a bad conversion. So the last value of the square table is written directly and not computed.

 

It looks like the PI value is closer to the one expected now. But, I didn't let the program run up to 119 millions.... Just a few millions..

 

Here is the new ZIP file with the fixed program.

 

Guillaume.

 

screen.png

DISK1.zip

  • Like 2
Link to comment
Share on other sites

5 hours ago, Vorticon said:

I let the MLC version run for a while, and it seems that the Pi value is getting stuck around the 1.427 value +/- 0.005 or so after over 119 million iterations. I wonder if this is a limitation of the RND algorithm.

You made me wonder about the quality of my random generator!

 

So I made some tests:

a program that tests the distribution of one million random numbers:

into a table from test(0) to test(4095) it counts how many times one number is returned

 

If this was a perfect random generator, we should have:

  • table(i)=1.000.000/4096 = 244
  • mean = 2047.5
  • standard deviation = 1182.4

Here is what I get after millions and millions tries (if we look at the last run):

  • all table(i) are included into [178 ; 296]
  • all values are reached
  • mean is 2048
  • standard deviation is 1183

It appears that this generator is not so bad.

 

Guillaume.

MLCtest.png

  • Like 2
Link to comment
Share on other sites

Hi again,

 

I thought that the PI calculation requires two consecutive random numbers to represent X and Y.

What about the differences between two consecutive terms?

 

**** UPDATE ****

I forgot in a first idea that the differences are not equivalent in probability.

To get 4095 : only one solution 4095-0.

But to get zero : 0-0, or 1-1, or 2-2 etc...

So I change the rest of the post

***************

 

Picking numbers from 0 to 4095 leads to:

  • differences are from -4095 to + 4095
  • the perfect mean is zero
  • the standard deviation 1672
  • the perfect mean of absolute differences should be 1365

 

Looking at the result, the generator is correct even when thinking about the independency between two consecutive terms.

 

Guillaume.

 

MLCtest.png

Edited by moulinaie
  • Like 1
Link to comment
Share on other sites

3 hours ago, moulinaie said:

Hi again,

 

I thought that the PI calculation requires two consecutive random numbers to represent X and Y.

What about the differences between two consecutive terms?

 

**** UPDATE ****

I forgot in a first idea that the differences are not equivalent in probability.

To get 4095 : only one solution 4095-0.

But to get zero : 0-0, or 1-1, or 2-2 etc...

So I change the rest of the post

***************

 

Picking numbers from 0 to 4095 leads to:

  • differences are from -4095 to + 4095
  • the perfect mean is zero
  • the standard deviation 1672
  • the perfect mean of absolute differences should be 1365

 

Looking at the result, the generator is correct even when thinking about the independency between two consecutive terms.

 

Guillaume.

 

MLCtest.png

Impressive results! 

I went ahead and did a quick and dirty evaluation of the XB RND function generating 3000 numbers from 1-10, the maximum array size I could fit in XB. This is the ideal result:

192761267_RNDideal.jpg.0544089c9af379d5dac868cfd77f3f08.jpg

 

and this is the actual result:

 

1149634134_RNDtest.jpg.35a827f4527ed88b005c6991eaa8c8fa.jpg

 

Really not bad at all for only 3000 data points. 

  • Like 1
Link to comment
Share on other sites

23 minutes ago, Vorticon said:

Impressive results! 

I went ahead and did a quick and dirty evaluation of the XB RND function generating 3000 numbers from 1-10, the maximum array size I could fit in XB. This is the ideal result:

192761267_RNDideal.jpg.0544089c9af379d5dac868cfd77f3f08.jpg

 

and this is the actual result:

 

1149634134_RNDtest.jpg.35a827f4527ed88b005c6991eaa8c8fa.jpg

 

Really not bad at all for only 3000 data points. 

Sure ! It's very close to perfection !

 

  • Like 2
Link to comment
Share on other sites

6 hours ago, Vorticon said:

Impressive results! 

I went ahead and did a quick and dirty evaluation of the XB RND function generating 3000 numbers from 1-10, the maximum array size I could fit in XB. This is the ideal result:

192761267_RNDideal.jpg.0544089c9af379d5dac868cfd77f3f08.jpg

 

and this is the actual result:

 

1149634134_RNDtest.jpg.35a827f4527ed88b005c6991eaa8c8fa.jpg

 

Really not bad at all for only 3000 data points. 

Could you do this for RXB or TI BASIC? It'd be interesting to see how they compare

  • Like 1
Link to comment
Share on other sites

Hi everybody,

 

I modified the program : now you can stop and save the data on disk to run it again later. On and on... up to 4 billions?

 

While the computer is calculating, if you press the SPACE BAR (until a new line is displayed):

 

screen.png.61e5fcb71205f3e4ebf046021f1ef3b8.png

 

And when you run it later, you can reload from file:

 

MLCtest.png.4b8ce7e0fc9229b3c7432b5348df7bf9.png

 

That's it !

 

Guillaume.

DISK1.zip

  • Like 1
Link to comment
Share on other sites

7 hours ago, senior_falcon said:

Could you do this for RXB or TI BASIC? It'd be interesting to see how they compare

 

Here you go, with the caveat that the array size is limited to 1500 in TI Basic:

 

10 CALL CLEAR
20 RANDOMIZE
30 OPTION BASE 1
40 DIM N(1500)
50 PRINT "PHASE 1:"
60 FOR I=1 TO 1500
70 N(I)=(RND*10)+1
80 T=T+N(I)
90 NEXT I
100 PRINT "PHASE 2:"
110 MEAN=T/1500
120 FOR I=1 TO 1500
130 T1=T1+(N(I)-MEAN)^2
140 PRINT I
150 NEXT I
160 SD=SQR(T1/1500)
170 PRINT "MEAN:";MEAN:"SD:";SD

BasicRND.jpg.1f01bd94f56803a6df85d84772f9efef.jpg

 

Using the same array size in XB gives:

 

XBRND.jpg.65707f91d112b6541ef4149b78e0a873.jpg

 

XB is still better, but not my much, although I do expect the gap to widen with a larger number of iterations.

 

  • Like 1
Link to comment
Share on other sites

18 minutes ago, Vorticon said:

 

Here you go, with the caveat that the array size is limited to 1500 in TI Basic:

 

 

 

 

Hi,

 

If you change the organization of your DATA, there is no, limitation.

You can use a table, let's say form T(0) to T(9) that count how many times a 0, or a 1 , or ... a 9 has appeared with RND.

This way, you just have to reserve memory for ten numbers.

 

Then, there is a simplified formula for standard deviation :

SD = SQR ( [sum of squares] / N - [square of mean] )

 

100 CALL CLEAR
110 DIM T(9)
120 RANDOMIZE
125 INPUT "How many ":N
130 FOR I=1 TO N
140 X=INT(RND*10)
150 T(X)=T(X)+1
160 NEXT I
170 S=0
180 S2=0
190 FOR I=0 TO 9
200 S=S+T(I)*I
210 S2=S2+T(I)*I*I
220 NEXT I
230 S=S/N
240 S2=S2/N
250 SD=SQR(S2-S*S)
260 PRINT "Mean=";S
270 PRINT "S.Dev=";SD

I prefer 0 to 9 than 1 to 10, so I skip the "+1" at each random!

 

The expected values are:

MEAN = 4.5

SD = 2.87

 

Works both in TI Basic and XB.

 

Guillaume.

  • Like 1
Link to comment
Share on other sites

33 minutes ago, moulinaie said:

Hi,

 

If you change the organization of your DATA, there is no, limitation.

You can use a table, let's say form T(0) to T(9) that count how many times a 0, or a 1 , or ... a 9 has appeared with RND.

This way, you just have to reserve memory for ten numbers.

 

Then, there is a simplified formula for standard deviation :

SD = SQR ( [sum of squares] / N - [square of mean] )

 


100 CALL CLEAR
110 DIM T(9)
120 RANDOMIZE
125 INPUT "How many ":N
130 FOR I=1 TO N
140 X=INT(RND*10)
150 T(X)=T(X)+1
160 NEXT I
170 S=0
180 S2=0
190 FOR I=0 TO 9
200 S=S+T(I)*I
210 S2=S2+T(I)*I*I
220 NEXT I
230 S=S/N
240 S2=S2/N
250 SD=SQR(S2-S*S)
260 PRINT "Mean=";S
270 PRINT "S.Dev=";SD

I prefer 0 to 9 than 1 to 10, so I skip the "+1" at each random!

 

The expected values are:

MEAN = 4.5

SD = 2.87

 

Works both in TI Basic and XB.

 

Guillaume.

Yes of course! Did not think of it that way. Well done.

  • Like 1
Link to comment
Share on other sites

2 hours ago, Vorticon said:

 

Here you go, with the caveat that the array size is limited to 1500 in TI Basic:

 


10 CALL CLEAR
20 RANDOMIZE
30 OPTION BASE 1
40 DIM N(1500)
50 PRINT "PHASE 1:"
60 FOR I=1 TO 1500
70 N(I)=(RND*10)+1
80 T=T+N(I)
90 NEXT I
100 PRINT "PHASE 2:"
110 MEAN=T/1500
120 FOR I=1 TO 1500
130 T1=T1+(N(I)-MEAN)^2
140 PRINT I
150 NEXT I
160 SD=SQR(T1/1500)
170 PRINT "MEAN:";MEAN:"SD:";SD

BasicRND.jpg.1f01bd94f56803a6df85d84772f9efef.jpg

 

Using the same array size in XB gives:

 

XBRND.jpg.65707f91d112b6541ef4149b78e0a873.jpg

 

XB is still better, but not my much, although I do expect the gap to widen with a larger number of iterations.

 

RXB got:

MEAN: 5.923564439

SD:     2.929720887

 

That seems odd as second run says:

MEAN: 5.965401107

SD:     2.921225948

Link to comment
Share on other sites

Here is the RXB versus XB RND function comparison using Guillaume's program for an N of 5000. Again expected values are mean= 4.5 and SD=2.87

 

RXB:

RXBRND.jpg.1b8c649ec694ba5324e4c9ee124d12c1.jpg

 

XB:

XBRND.jpg.6b4d04a72e17243bfae98dcccaca6eaa.jpg

 

Not a huge difference for all practical purposes unless a very large set of random numbers are needed such as in the PI approximation program in which case the XB RND will be superior.

  • Like 1
Link to comment
Share on other sites

23 minutes ago, Vorticon said:

Here is the RXB versus XB RND function comparison using Guillaume's program for an N of 5000. Again expected values are mean= 4.5 and SD=2.87

 

RXB:

RXBRND.jpg.1b8c649ec694ba5324e4c9ee124d12c1.jpg

 

XB:

XBRND.jpg.6b4d04a72e17243bfae98dcccaca6eaa.jpg

 

Not a huge difference for all practical purposes unless a very large set of random numbers are needed such as in the PI approximation program in which case the XB RND will be superior.

Yea well I swapped out the XB RND for TI Basic RND for the speed difference not accuracy. (Bonus was a lot of more GRAM space.)

Link to comment
Share on other sites

Some 4.2 billion iterations and we have the first 3 decimals of PI=3.141 using Guillaume's program! It took about 3 days to get this far under Classic99 in Overdrive mode and TI XB.

I'm letting it run for a while longer and see if we can score a 4th decimal :) 

 

PI-MLC.jpg.3e63dbfc8c1d3f14aab6b071d4267ee5.jpg

  • Like 5
Link to comment
Share on other sites

I have been working on a Forth version, which I could post now, but I want to be able to discuss it, and that will not happen until I get home on Thursday—too much going on. A day or so after that, I should probably be able to get back to it. We shall see.

 

Just a teaser: I first used floating point math in the loop, but that approached XB’s pace. Then I worked out a way with 32-bit integers, which is very much faster. I was as disappointed as you, Walid, to discover how long it was likely to take for a reasonable value. :-o

 

TTFN...

 

..lee

  • Like 3
  • Thanks 1
Link to comment
Share on other sites

The standard calculation of pi produces a number that extends to infinity but we don't really need that.  Back in 1706 a good approximation calculation was produced by John Machin and we can program that to produce quite a few accurate decimal places fairly quickly in Extended Basic.

I wrote the program below back in March 1991.  It uses the Extended Basic "logical operator" AND. You can see what this does with FOR T=1 TO 20 :: PRINT T;T AND 2 :: NEXT T


 

However- calculating PI:
 1 ! from W F DOSSETT, 
 AUSTIN, TEXAS, 
 25 feb 88
 2 ! REC NEWSLETTER March 1988 Vol 3 #2
 3 ! for ti99/4a s shaw 3/91
 4 ! from John Machin, 1706
 7 ! n=7 for 13 digit accuracy of ti99/4a 
 8 ! n>7 if language goes beyond 13 digits!
 9 ! eg n=35 for 53 digits
 10 !
 100 N=7 :: K=-1
 110 K=K+1
 120 I=-((2 AND 2*K)-1)
 130 U=U+4*I/((2*K+1)*5^(2*K+1))
 140 V=V+I/((2*K+1)*239^(2*K+1))
 150 IF K<=N THEN 110
 160 W=U-V :: PI2=4*W
 170 ! DONE
 180 PRINT PI2,PI
 181 ! calculated number then onboard number
 190 PRINT (PI2-PI)*1000,! COMPARE with on board variable
 191 ! difference times 1000 makes it easier to see
 200 PRINT (PI2-(4*ATN(1)))*1000 ! compare with TI Basic's calculation
 210 PRINT " ";(PI2-3.14)*100;:: DISPLAY AT(24,2)SIZE(4):"3.14" ! displays ALL the digits actually in the variable!!!=13 incl dec point.
 220 PRINT " 3.14159265358979 -etc" ! more accurate actual value for comparison!
 230 END
see https://en.wikipedia.org/wiki/John_Machin

"The benefit of the new formula, a variation on the Gregory/Leibniz series (Pi/4 = arctan 1), was that it had a significantly increased rate of convergence, which made it a much more practical method of calculation."
 

s




 

Edited by blackbox
references
  • Like 3
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...