| Bytes | Lang | Time | Link |
|---|---|---|---|
| 151 | Java 10 | 201021T151500Z | Kevin Cr |
| 015 | Wolfram Language Mathematica | 250527T091853Z | Lucenapo |
| 024 | APLNARS | 240104T134357Z | Rosario |
| 053 | JavaScript | 240826T115211Z | Shaggy |
| 083 | Python 2 | 140104T033117Z | Soulman |
| 9684 | Scala 3 | 240106T061242Z | 138 Aspe |
| 144 | Fortran | 201023T095440Z | roblogic |
| 044 | Raku | 220930T205620Z | Sean |
| 020 | APL NARS2000 | 201125T204229Z | user |
| 024 | Husk | 201021T141918Z | Dominic |
| 020 | 05AB1E | 201021T154514Z | Kevin Cr |
| 021 | Pyth | 141023T235500Z | izzyg |
| 080 | Axiom | 170424T073822Z | user5898 |
| 014 | PARI/GP | 150204T164501Z | Charles |
| 050 | Mathematica | 140226T125505Z | swish |
| 034 | Mathematica | 140226T032721Z | Stack Tr |
| 017 | Mathematica | 110313T011131Z | Quixotic |
| 029 | Golfscript | 110204T134121Z | gnibbler |
| nan | 110204T152952Z | Alexandr | |
| 136 | Python3 | 110204T144744Z | Alexandr |
Java 10, 208 207 206 193 176 155 151 bytes
n->{var t=java.math.BigInteger.TEN.pow(499);var p=t=t.add(t);for(int i=1656;i>0;)p=t.add(p.multiply(t.valueOf(i)).divide(t.valueOf(i-~i--)));return p;}
-18 bytes thanks to @ceilingcat.
-17 bytes thanks to @jeJe.
-21 bytes thanks to @Neil reverting the algorithm.
Or as full program (199 bytes):
interface M{static void main(String[]a){var t=java.math.BigInteger.TEN.pow(499).shiftLeft(1);var p=t;for(int i=1656;i>0;)p=t.add(p.multiply(t.valueOf(i)).divide(t.valueOf(i-~i--)));System.out.print(p);}}
APL(NARS), 24 chars
{⎕fpc←!7⋄¯2↓502⍕4×0∘○∫1}
I searched one integral that return a π near number...
I found the answer https://codegolf.stackexchange.com/a/22172/120560 helpfull... Above integral 0∘○∫1 should be the integral sqrt(1-x^2) in 0..1 that would be π/4.
Here there is a builtin function 0○⍵ that return √1-⍵×⍵. A little long solution using integrals is this.
{⎕fpc←!7⋄¯2↓502⍕4×{÷1+⍵*2}∫1}
but it would be 29 chars even if more clear...
It seems integration by default use only the floats controlled from ⎕fpc. It seems that ⎕fpc←!7 change ⎕fpc only inside
the function. Until +-777 digits of Pi calculate with integrals it seems ok, after not.
JavaScript, 53 bytes
Port of Kevin's Java solution.
f=(p=t=10n**500n*2n,i=1656n)=>i?f(t+p*i/(i-~i),--i):p
Python 2, 83 bytes
P=0
B=10**500
i=1666
while i:d=2*i+1;P=(P*i%B+(P*i/B+3*i)%d*B)/d;i-=1
print'3.%d'%P
Scala 3, 96 84 bytes
A port of @Kevin Cruijssen's Java 10 answer in Scala.
Saved 12 bytes thanks to @ceilingcat
Golfed version. Attempt This Online!
_=>{val t=BigInt(10).pow(499)*2;var p=t;for i<- 1656 to 1 by-1 do p=t+p*i/(2*i+1);p}
Ungolfed version. Attempt This Online!
_ => {
val t = BigInt(10).pow(499) << 1
var p = t
var i = 1656
while (i > 0) {
val temp = 2 * i + 1
p = t + (p * BigInt(i) / temp)
i -= 1
}
p
}
Fortran, 154 144 bytes
Mangled the rosetta code solution. Saved lots of bytes using implicit integers i j k l m n, print instead of write, and shuffling things around.
integer::v(3350)=2;x=1E5;j=0;do n=1,101;do l=3350,1,-1
m=x*v(l)+i*l;i=m/(2*l-1);v(l)=m-i*(2*l-1);enddo
k=i/x;print'(I5.5)',j+k;j=i-k*x;enddo;end
Raku, 44 bytes
(2.FatRat,{++$*$_/(2*++$+1)}...*)[^1658].sum
A search for a series that quickly converges to pi led to this Math StackExchange answer, which I implemented in Raku. The series consists of FatRats, which is Raku's unlimited-precision rational number type. A little calculation and trial and error showed that 1,658 terms are sufficient to obtain 500 decimal places of accuracy.
APL (NARS2000), 20 bytes
{2+⍵×⍺÷1+⍨2×⍺}/⍳7e3x
I haven't been able to test this, but here's a version in Dyalog APL. The only difference between them is the suffix "x", which is used for rational numbers in NARS2000 but is not available in Dyalog (or other variants available online, as far as I know).
It's based on the pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) formula in the comments under the accepted Golfscript answer.
Husk, 28 25 24 bytes
i*!500İ⁰ΣG*2mṠ/o!İ1→ḣ□70
Calculates the value of pi as a rational number using the first 5000 terms of the infinite series 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))), and then extracts the first 500 digits.
The code to calculate the value of pi from a specified number of terms is only 13 bytes (ΣG*2mṠ/o!İ1→ḣ):
ΣG*2mṠ/o!İ1→ḣ
Σ # the sum of
G*2 # the cumulative product, starting at 2, of
m # mapping the following function to all terms of
ḣ # series from 1 to ... (whatever number is specified)
Ṡ/ # divide by x
o! → # element at index -1
İ1 # of series of odd numbers
Unfortunately, we then need to waste 3 bytes specifying the number of terms to use:
□70 # 70^2 = 4900
And then 8 more bytes converting the rational number (expressed as a fraction) into its digits in decimal form:
i*!500İ⁰
i # integer value of
* # multiplying by
!500 # 500th element of
İ⁰ # series of powers of 10
05AB1E, 20 bytes
₄°·D.ΓN>*N·3+÷}O+₄;£
Port of my Java answer (with the 503 replaced with 1000 - anything \$\geq503\$ is fine to output the first 500 digits accurately with this approach).
Try it online or verify it's equal to the first 500 digits of PI using the builtin žs.
Explanation:
₄° # Push 10**1000
· # Double it to 2e1000
D # Duplicate it
.Γ # Loop until the result no longer changes,
# collecting all intermediate results
# (excluding the initial value unfortunately)
N> # Push the 0-based loop-index, and increase it by 1 to make it 1-based
* # Multiply this 1-based index to the current value
N· # Push the 0-based index again, and double it
3+ # Add 3 to it
÷ # Integer-divide the (index+1)*value by this (2*index+3)
}O # After the cumulative fixed-point loop: sum all values in the list
+ # Add the 2e1000 we've duplicated, which wasn't included in the list
₄; # Push 1000, and halve it to 500
£ # Leave the first 500 digits of what we've calculated
# (after which it is output implicitly as result)
Pyth, 21
u+/*GHhyHy^T500r^3T1Z
Uses this algorithm:
pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) found in the comments of the Golfscript answer.
Axiom, 80 bytes
digits(503);v:=1./sqrt(3);6*reduce(+,[(-1)^k*v^(2*k+1)/(2*k+1)for k in 0..2000])
for reference https://tuts4you.com/download.php?view.452; it would be an approssimation to 6*arctg(1/sqrt(3))=%pi and it would use serie expansion for arctg
3.1415926535 8979323846 2643383279 5028841971 6939937510 5820974944 592307816
4 0628620899 8628034825 3421170679 8214808651 3282306647 0938446095 505822317
2 5359408128 4811174502 8410270193 8521105559 6446229489 5493038196 442881097
5 6659334461 2847564823 3786783165 2712019091 4564856692 3460348610 454326648
2 1339360726 0249141273 7245870066 0631558817 4881520920 9628292540 917153643
6 7892590360 0113305305 4882046652 1384146951 9415116094 3305727036 575959195
3 0921861173 8193261179 3105118548 0744623799 6274956735 1885752724 891227938
1 8301194913 01
PARI/GP, 14
\p500
acos(-1)
You can avoid trig by replacing the second line with
gamma(.5)^2
or
(6*zeta(2))^.5
or
psi(3/4)-psi(1/4)
or
4*intnum(x=0,1,(1-x^2)^.5)
or
sumalt(k=2,(-1)^k/(2*k-3))*4
Mathematica - 50
½ = 1/2; 2/Times @@ FixedPointList[(½ + ½ #)^½~N~500 &, ½^½]
Mathematica (34 chars): (without "cheating" with trig)
N[2Integrate[[1-x^2]^.5,-1,1],500]
So, to explain the magic here:
Integrate[function, lower, upper] gives you the area under the curve "function" from "lower" to "upper". In this case, that function is [1-x^2]^.5, which is a formula that describes the top half of a circle with radius 1. Because the circle has a radius of 1, it does not exist for values of x lower than -1 or higher than 1. Therefore, we are finding the area of half of a circle. When we multiply by 2, then we get the area inside of a circle of radius 1, which is equal to pi.
Golfscript - 29 chars
6666,-2%{2+.2/@*\/9)499?2*+}*
I will post analysis later
bc -l (22 = 5 command line + 17 program)
scale=500
4*a(1)
Python3 136
Uses Madhava's formula.
from decimal import *
D=Decimal
getcontext().prec=600
p=D(3).sqrt()*sum(D(2-k%2*4)/3**k/(2*k+1)for k in range(1100))
print(str(p)[:502])
Python3 164
Uses this formula.
from decimal import *
D=Decimal
getcontext().prec=600
p=sum(D(1)/16**k*(D(4)/(8*k+1)-D(2)/(8*k+4)-D(1)/(8*k+5)-D(1)/(8*k+6))for k in range(411))
print(str(p)[:502])