Circumference of an Ellipse

Collected by Paul Bourke

Corrections and contributions by David Cantrell and Charles Karney.

Paper by Paul Abbott: Abbott.pdf

Update (June 2013) by Charles Karney and the AGM (Arithmetic Geometric Mean) algorithm.


a - Major axis radius
b - Minor axis radius
e - eccentricity = (1 - b2 / a2)1/2
f - focus = (a2 - b2)1/2
h = (a - b)2 / (a + b)2
area = pi a b

The following lists and evaluates some of the approximations that can be used to calculate the circumference of an ellipse. To some, perhaps surprising that there is not a simple closed solution, as there is for the special case, a circle. All the expressions below reduce to the equation of a circle when a=b. Most (not all) perform more poorly as the ratio b/a increases.

Anonymous

pi [ 2*(a*a + b*b) - 0.5*(a-b)*(a-b) ]1/2

Ramanujan, first approximation

pi ( 3 (a + b) - [ (a + 3 b) (3 a + b) ]1/2 )

Ramanujan, second approximation

pi (a + b) [ 1 + 3 h / (10 + (4 - 3 h)1/2 ) ]

This is one of the more accurate approximation presented here although it degrades for large b/a ratios.

Hudson

0.25 pi (a + b) [ 3 (1 + h/4) + 1 / (1 - h/4) ]

This does not use any computationally expensive functions.

Holder mean

4 [ as + bs ]1/s   where s = log(2) / log(pi/2)

Similarly for low eccentricities (Muir, 1883).

2 pi [ as/2 + bs/2 ]1/s   where s = 1.5

David Cantrell

4 (a + b) - 2 (4 - pi) a b / [ as/2 + bs/2 ]1/s    where s = 0.825056.
Exact

There is an exact series expansion but it converges rather slowly and it has numerical issues due to the need for large factorials.

  infinity  
2 pi a
-e2i [ (2i)! / (2i i!)2 ]2

2i - 1
  i = 0  

Integral (exact)

The following can be derived directly from the line integral of the equation of an ellipse.

  pi/2  
4 a sqrt[ 1 - e2 sin2(t) ]dt
  0  

Necat Tasdelen

Various approximations are provided by Necat Tasdelen, they consist of improved estimates of "s" for what is referred to as the Holder method above. Three estimates of "s" are provided in the examples below, a constant value (same as Holder), a linear, and a power fit estimate. The later is one of the more accurate approximations presented here for extreme eccentricities. For the further details the reader is directed to the documents above.

Ellipse Perimeter Estimation by Necat Tasdelen: Necat.pdf and the equivalent elliptic integrals: eliptic.pdf

Bessel

Charles Karney contributed this rapidly converging series attributed to Bessel (1825).

Code contributions

Contribution by Bill Gran: gran.png and a nifty little Excel Calculator: GRAN_Method_Calculator.xlsx.zip. Appears in ANC-5 Strength of Metal Aircraft Elements March 1955 Revised Edition Section 1.535, pages 11-13. GRAN Formula for the Complete Elliptic Integral of the Second Kind.

Adjustments to Ramanujan's formula and tables Ramanujan.xls.zip by Hassan Abed, as well as modifications to Hudson formula and correction, and his own approximations AbedsFormulas.xls.zip

AGM algorithm contributed by Charles Karney and based upon Carlson, B. C. (1995). "Computation of real or complex elliptic integrals". Numerical Algorithms 10. This algorithm converses quadratically, that is, the number of correct digits doubles on each iteration so the fastest converging series of those presented here. Versions: Maxima, Python and C. The series was first proposed by James Ivory, A new series for the rectification of the ellipsis, Trans. Roy. Soc. Edinburgh 4, 177-190 (1798).

This simple C code evaluates the various estimates given above. Some example output is given below. All methods give exact estimates for a circle, for example, a unit circle. This is hardly unexpected since they reduce to the equation of a circle for a=b. All error are given as relative error (estimate - actual) / actual. In the following the "ground truth" is taken to be the AGM algorihm.

Example: a=1, b=1

e  : 0.0000000000
h  : 0.0000000000
b/a: 1.0000000000
Numerical             :  6.27672765822760    Error: 0.001028       (       10 segments)
Numerical             :  6.28312071096907    Error: 0.010 x10(-3)  (      100 segments)
Numerical             :  6.28318466121547    Error: 0.103 x10(-6)  (     1000 segments)
Numerical             :  6.28318530072077    Error: 0.001 x10(-6)  (    10000 segments)
Numerical             :  6.28318530710706    Error: 0.012 x10(-9)  (   100000 segments)
Numerical             :  6.28318530717921    Error: 0.059 x10(-12) (  1000000 segments)
Numerical             :  6.28318530717957    Error: 0.002 x10(-12) ( 10000000 segments)
Numerical             :  6.28318530717915    Error: 0.069 x10(-12) (100000000 segments)
Integral              :  6.28318530717959    Error: 0.000 x10(-12) (       10 segments)
Integral              :  6.28318530717958    Error: 0.001 x10(-12) (      100 segments)
Integral              :  6.28318530717947    Error: 0.018 x10(-12) (     1000 segments)
Integral              :  6.28318530718043    Error: 0.134 x10(-12) (    10000 segments)
Integral              :  6.28318530717586    Error: 0.593 x10(-12) (   100000 segments)
Integral              :  6.28318530715542    Error: 0.004 x10(-9)  (  1000000 segments)
Integral              :  6.28318530604334    Error: 0.181 x10(-9)  ( 10000000 segments)
Integral              :  6.28318532160340    Error: 0.002 x10(-6)  (100000000 segments)
Circle circumference  :  6.28318530717959    Error: 0.000 x10(-12)
Anonymous             :  6.28318530717959    Error: 0.000 x10(-12)
Hudson                :  6.28318530717959    Error: 0.000 x10(-12)
Ramanujan 1           :  6.28318530717959    Error: 0.000 x10(-12)
Ramanujan 11          :  6.28318530717959    Error: 0.000 x10(-12)
Holder mean           :  6.28318530717959    Error: 0.000 x10(-12) (s: 1.534928535661375)
Cantrell              :  6.28318530717959    Error: 0.000 x10(-12) (s: 0.829896183162743)
Exact                 :  6.28318530717959    Error: 0.000 x10(-12) (   10 terms)
Exact                 :  6.28318530717959    Error: 0.000 x10(-12) (   50 terms)
Exact                 :  6.28318530717959    Error: 0.000 x10(-12) (  250 terms)
Exact                 :  6.28318530717959    Error: 0.000 x10(-12) ( 1250 terms)
Necat (constant s)    :  6.28318530717959    Error: 0.000 x10(-12) (s: 1.534928535661375)
Necat (linear s)      :  6.28318530717958    Error: 0.001 x10(-12) (s: 1.534928535661380)
Necat (power s)       :  6.28318530717958    Error: 0.001 x10(-12) (s: 1.534928535661380)
Bessel                :  6.28318530717959    Error: 0.000 x10(-12) (   10 terms)
Bessel                :  6.28318530717959    Error: 0.000 x10(-12) (  100 terms)
Bessel                :  6.28318530717959    Error: 0.000 x10(-12) ( 1000 terms)
Example: a=1, b=2 (Modest eccentricity)

e  : 0.8660254038
h  : 0.1111111111
b/a: 0.5000000000
Numerical             :  9.67849075560978    Error: 0.001028       (       10 segments)
Numerical             :  9.68834861548905    Error: 0.010 x10(-3)  (      100 segments)
Numerical             :  9.68844722449405    Error: 0.103 x10(-6)  (     1000 segments)
Numerical             :  9.68844821058716    Error: 0.001 x10(-6)  (    10000 segments)
Numerical             :  9.68844822044810    Error: 0.010 x10(-9)  (   100000 segments)
Numerical             :  9.68844822054622    Error: 0.150 x10(-12) (  1000000 segments)
Numerical             :  9.68844822054806    Error: 0.040 x10(-12) ( 10000000 segments)
Numerical             :  9.68844822054901    Error: 0.138 x10(-12) (100000000 segments)
Integral              :  9.68844822056413    Error: 0.002 x10(-9)  (       10 segments)
Integral              :  9.68844822054768    Error: 0.000 x10(-12) (      100 segments)
Integral              :  9.68844822054768    Error: 0.000 x10(-12) (     1000 segments)
Integral              :  9.68844822054761    Error: 0.006 x10(-12) (    10000 segments)
Integral              :  9.68844822054766    Error: 0.002 x10(-12) (   100000 segments)
Integral              :  9.68844822054803    Error: 0.036 x10(-12) (  1000000 segments)
Integral              :  9.68844822054681    Error: 0.089 x10(-12) ( 10000000 segments)
Integral              :  9.68844822054597    Error: 0.176 x10(-12) (100000000 segments)
Anonymous             :  9.68303887270669    Error: 0.558 x10(-3) 
Hudson                :  9.68844734419566    Error: 0.090 x10(-6) 
Ramanujan 1           :  9.68842109767129    Error: 0.003 x10(-3) 
Ramanujan 11          :  9.68844821613009    Error: 0.456 x10(-9) 
Holder mean           :  9.70448163064351    Error: 0.001655       (s: 1.534928535661375)
Cantrell              :  9.68854806636610    Error: 0.010 x10(-3)  (s: 0.829896183162743)
Exact                 :  9.69160447929656    Error: 0.326 x10(-3)  (   10 terms)
Exact                 :  9.68844822218643    Error: 0.169 x10(-9)  (   50 terms)
Exact                 :  9.68844822054768    Error: 0.000 x10(-12) (  250 terms)
Exact                 :  9.68844822054768    Error: 0.000 x10(-12) ( 1250 terms)
Necat (constant s)    :  9.70448163064351    Error: 0.001655       (s: 1.534928535661375)
Necat (linear s)      :  9.68804165995463    Error: 0.042 x10(-3)  (s: 1.541982035153419)
Necat (power s)       :  9.68839441141184    Error: 0.006 x10(-3)  (s: 1.541829751678717)
Bessel                :  9.68844822054742    Error: 0.026 x10(-12) (   10 terms)
Bessel                :  9.68844822054768    Error: 0.000 x10(-12) (  100 terms)
Bessel                :  9.68844822054768    Error: 0.000 x10(-12) ( 1000 terms)
Example: a=1, b=10

e  : 0.9949874371
h  : 0.6694214876
b/a: 0.1000000000
Numerical             : 40.60042321878313    Error: 0.967 x10(-3)  (       10 segments)
Numerical             : 40.63932399169911    Error: 0.010 x10(-3)  (      100 segments)
Numerical             : 40.63973762290312    Error: 0.103 x10(-6)  (     1000 segments)
Numerical             : 40.63974175922775    Error: 0.001 x10(-6)  (    10000 segments)
Numerical             : 40.63974180059099    Error: 0.010 x10(-9)  (   100000 segments)
Numerical             : 40.63974180100578    Error: 0.078 x10(-12) (  1000000 segments)
Numerical             : 40.63974180101561    Error: 0.164 x10(-12) ( 10000000 segments)
Numerical             : 40.63974180100927    Error: 0.008 x10(-12) (100000000 segments)
Integral              : 40.64219391439480    Error: 0.060 x10(-3)  (       10 segments)
Integral              : 40.63974180100898    Error: 0.001 x10(-12) (      100 segments)
Integral              : 40.63974180100900    Error: 0.001 x10(-12) (     1000 segments)
Integral              : 40.63974180100901    Error: 0.001 x10(-12) (    10000 segments)
Integral              : 40.63974180100879    Error: 0.004 x10(-12) (   100000 segments)
Integral              : 40.63974180101027    Error: 0.032 x10(-12) (  1000000 segments)
Integral              : 40.63974180100751    Error: 0.036 x10(-12) ( 10000000 segments)
Integral              : 40.63974180107515    Error: 0.002 x10(-9)  (100000000 segments)
Anonymous             : 39.92419204913146    Error: 0.017607      
Hudson                : 40.63151007270351    Error: 0.203 x10(-3) 
Ramanujan 1           : 40.60552518514097    Error: 0.842 x10(-3) 
Ramanujan 11          : 40.63927210018871    Error: 0.012 x10(-3) 
Holder mean           : 40.75658566530318    Error: 0.002875       (s: 1.534928535661375)
Cantrell              : 40.63266238102069    Error: 0.174 x10(-3)  (s: 0.819493675056663)
Exact                 : 41.42030490115282    Error: 0.019207       (   10 terms)
Exact                 : 40.70623873690818    Error: 0.001636       (   50 terms)
Exact                 : 40.64052842541464    Error: 0.019 x10(-3)  (  250 terms)
Exact                 : 40.63974180295930    Error: 0.048 x10(-9)  ( 1250 terms)
Necat (constant s)    : 40.75658566530318    Error: 0.002875       (s: 1.534928535661375)
Necat (linear s)      : 40.64117543670444    Error: 0.035 x10(-3)  (s: 1.591286056206585)
Necat (power s)       : 40.63991083864542    Error: 0.004 x10(-3)  (s: 1.591960989144423)
Bessel                : 40.63963178516602    Error: 0.003 x10(-3)  (   10 terms)
Bessel                : 40.63974180100895    Error: 0.000 x10(-12) (  100 terms)
Bessel                : 40.63974180100895    Error: 0.000 x10(-12) ( 1000 terms)
Example: a = 1, b = 1000 (Extreme eccentricity)

e  : 0.9999995000
h  : 0.9960079880
b/a: 0.0010000000
Numerical             : 4000.00700622830936    Error: 0.002 x10(-3)  (       10 segments)
Numerical             : 4000.01160343712263    Error: 0.996 x10(-6)  (      100 segments)
Numerical             : 4000.01520168268371    Error: 0.097 x10(-6)  (     1000 segments)
Numerical             : 4000.01558399234045    Error: 0.001 x10(-6)  (    10000 segments)
Numerical             : 4000.01558806354569    Error: 0.010 x10(-9)  (   100000 segments)
Numerical             : 4000.01558810436791    Error: 0.080 x10(-12) (  1000000 segments)
Numerical             : 4000.01558810497863    Error: 0.073 x10(-12) ( 10000000 segments)
Numerical             : 4000.01558809291328    Error: 0.003 x10(-9)  (100000000 segments)
Integral              : 4004.12231000731981    Error: 0.001027       (       10 segments)
Integral              : 4000.05272720403855    Error: 0.009 x10(-3)  (      100 segments)
Integral              : 4000.01561291779944    Error: 0.006 x10(-6)  (     1000 segments)
Integral              : 4000.01558810469305    Error: 0.001 x10(-12) (    10000 segments)
Integral              : 4000.01558810466850    Error: 0.005 x10(-12) (   100000 segments)
Integral              : 4000.01558810488496    Error: 0.049 x10(-12) (  1000000 segments)
Integral              : 4000.01558810481674    Error: 0.032 x10(-12) ( 10000000 segments)
Integral              : 4000.01558810381857    Error: 0.217 x10(-12) (100000000 segments)
Anonymous             : 3848.93374981198258    Error: 0.037770      
Hudson                : 3992.68624906240484    Error: 0.001832      
Ramanujan 1           : 3983.74047795885099    Error: 0.004069      
Ramanujan 11          : 3998.50189422870017    Error: 0.378 x10(-3) 
Holder mean           : 4000.06474173655124    Error: 0.012 x10(-3)  (s: 1.534928535661375)
Cantrell              : 4000.01691838166516    Error: 0.333 x10(-6)  (s: 0.819493675056663)
Exact                 : 4106.61427461212224    Error: 0.026650       (   10 terms)
Exact                 : 4020.25802285236841    Error: 0.005061       (   50 terms)
Exact                 : 4004.01689018024035    Error: 0.001000       (  250 terms)
Exact                 : 4000.80887965779220    Error: 0.198 x10(-3)  ( 1250 terms)
Necat (constant s)    : 4000.06474173655124    Error: 0.012 x10(-3)  (s: 1.534928535661375)
Necat (linear s)      : 4000.01962527412616    Error: 0.001 x10(-3)  (s: 1.693487200718332)
Necat (power s)       : 4000.01895467283884    Error: 0.842 x10(-6)  (s: 1.698124485349185)
Bessel                : 3998.65719052395661    Error: 0.340 x10(-3)  (   10 terms)
Bessel                : 4000.00902882897572    Error: 0.002 x10(-3)  (  100 terms)
Bessel                : 4000.01558741091912    Error: 0.173 x10(-9)  ( 1000 terms)