How do I calculate PI in C#?

2019-01-16 09:28发布

How can I calculate the value of PI using C#?

I was thinking it would be through a recursive function, if so, what would it look like and are there any math equations to back it up?

I'm not too fussy about performance, mainly how to go about it from a learning point of view.

标签: c# pi
21条回答
再贱就再见
2楼-- · 2019-01-16 10:04

What is PI? The circumference of a circle divided by its diameter.

In computer graphics you can plot/draw a circle with its centre at 0,0 from a initial point x,y, the next point x',y' can be found using a simple formula: x' = x + y / h : y' = y - x' / h

h is usually a power of 2 so that the divide can be done easily with a shift (or subtracting from the exponent on a double). h also wants to be the radius r of your circle. An easy start point would be x = r, y = 0, and then to count c the number of steps until x <= 0 to plot a quater of a circle. PI is 4 * c / r or PI is 4 * c / h

Recursion to any great depth, is usually impractical for a commercial program, but tail recursion allows an algorithm to be expressed recursively, while implemented as a loop. Recursive search algorithms can sometimes be implemented using a queue rather than the process's stack, the search has to backtrack from a deadend and take another path - these backtrack points can be put in a queue, and multiple processes can un-queue the points and try other paths.

查看更多
Deceive 欺骗
3楼-- · 2019-01-16 10:04

I like this paper, which explains how to calculate π based on a Taylor series expansion for Arctangent.

The paper starts with the simple assumption that

Atan(1) = π/4 radians

Atan(x) can be iteratively estimated with the Taylor series

atan(x) = x - x^3/3 + x^5/5 - x^7/7 + x^9/9...

The paper points out why this is not particularly efficient and goes on to make a number of logical refinements in the technique. They also provide a sample program that computes π to a few thousand digits, complete with source code, including the infinite-precision math routines required.

查看更多
我只想做你的唯一
4楼-- · 2019-01-16 10:06

Good overview of different algorithms:

I'm not sure about the complexity claimed for the Gauss-Legendre-Salamin algorithm in the first link (I'd say O(N log^2(N) log(log(N)))).

I do encourage you to try it, though, the convergence is really fast.

Also, I'm not really sure about why trying to convert a quite simple procedural algorithm into a recursive one?

Note that if you are interested in performance, then working at a bounded precision (typically, requiring a 'double', 'float',... output) does not really make sense, as the obvious answer in such a case is just to hardcode the value.

查看更多
登录 后发表回答