17

I would like to print e.g. 1000 or 2000 or 15000 decimals of pi value using R?

Now I get only six

> pi
[1] 3.141593

How to achieve this?

zx8754
  • 52,746
  • 12
  • 114
  • 209
jrara
  • 16,239
  • 33
  • 89
  • 120

7 Answers7

12

Using the R package bc (which is available at the foregoing link, not on CRAN):

> library(bc)
> bc("4 * a(1)", scale = 1000)
[1] "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201988"
G. Grothendieck
  • 254,981
  • 17
  • 203
  • 341
  • 2
    +1 But maybe easier just to copy/paste the numbers into a string variable!! ;-) – David Heffernan Jun 04 '11 at 17:58
  • 1
    @David, `bc` produces objects of class `c("bc", "character")` which can be further manipulated. e.g. `options(bc.scale = 1000); one <- bc(1); Pi <- 4*atan(one); Pi/2` . This is not equivalent to copying and pasting into a character variable. – G. Grothendieck Jun 04 '11 at 18:52
  • That's neat. I just saw the string representation in the output. I didn't know R could do operator overloading of the basic arithmetic operators. Has that capability always been available? – David Heffernan Jun 04 '11 at 19:10
  • @David, Yes, "ts" series, "Date" objects and other classes use this facility. – G. Grothendieck Jun 04 '11 at 22:32
  • I downloaded the .zip file from the Google Code site. But when I ``run install.packages("bc_1.05.zip", repos = NULL)`` I get: Warning in install.packages : cannot open compressed file 'bc/DESCRIPTION', probable reason 'No such file or directory' Error in install.packages : cannot open the connection Any suggestions? – timothy.s.lau Oct 22 '14 at 17:11
11

If you don't want to do the calculation yourself then you could look the number up. For example

pie <- read.csv("http://oeis.org/A000796/b000796.txt", header=FALSE, sep=" ")
dig <- 75 # up to 20000 digits 
pistring <- paste(c(pie[1,]$V2, ".", head(pie[-1,], dig-1)$V2), collapse="")

would produce

> pistring
[1] "3.14159265358979323846264338327950288419716939937510582097494459230781640628"
Henry
  • 6,704
  • 2
  • 23
  • 39
5

R works with the underlying system's floating point data type which typically have around 16 significant decimal figures.

If you want lots of digits of pi then you'll need to hold them in a character array of some such construct. You simply can't fit more than a handful into an R numeric value.

If you wish to generate the digits yourself then a websearch will reveal many articles outlining algorithms to do the job. Or you can find plenty of sites that just list pi to a gazillion digits.

David Heffernan
  • 601,492
  • 42
  • 1,072
  • 1,490
5

You can't print digits that you don't know. If R carries only 16 decimal digits (a typical IEEE double) then printing 1000 digits will generate 984 meaningless digits.

You can use one of the series or other methods seen here (e.g., the Brent-Salamin algorithm) to generate as many digits you want, IF you use a tool for long precision arithmetic. As a test, I recently computed well over 250,000 digits of pi with that method in only a few iterations.

3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420198 ...

3

It is very much possible. Please download package Rmpfr.

Then, use following:

library(Rmpfr)

Const("pi", 3333)

It will give value of pi correct to 1000 decimal places.

josliber
  • 43,891
  • 12
  • 98
  • 133
P L Patodia
  • 166
  • 1
  • 4
0

Not sure whether you can print 1000 or 2000, but this way you can specify how many digits are printed:

   print(pi, digits=10)
malkia
  • 1,389
  • 13
  • 12
  • 3
    Yep, this generates an error: > print(pi, digits=1000) Error in print.default(pi, digits = 1000) : invalid 'digits' argument – jrara Jun 04 '11 at 05:39
0

One of the easiest algorithms to use is probably a spigot. I don't know R but it's probably good enough to implement the ideas here.

sigfpe
  • 7,996
  • 2
  • 27
  • 48