另外一种算pi值的方法(更快的收敛)
还是采用newton计算pi的方法:
(x-1/2)^2+y^2=1/4
Go
x^x-x+1/4+y^2=1/4
GO
y=(sqrt x)(sqrt (1- x))
当x取0,1/2-(sqrt 3)/4) 时候,有如下关系成立: (角度为30)
这样有A=1*/2*1/2*pi/12 - 1/2*1/4*(sqrt 3)/4) (R=1/2)
pi=24* { A+ 1/2*(1/2- 1/64)*(sqrt (- (* 1/2 1/2) (* (1/2- 1/64) (1/2- 1/64) ))}
A=2*{ 1/3* x^(3/2) - 0.5/5*1!*{(x) }^(5/2) +0.5*(0.5-1)/7*2!*{-(x/a) }^(7/2) +0.5*(0.5-1)*(0.5-
2)/9*3!*{-(x/a)^(9/2)} } ... }
expr 为积分后的表达式。
(defun pow (n count)
(if (> count 0)
(* n
(pow n
(1- count)))
1))
(defun slayer (n count)
(if (> count 0)
(* n
(slayer (1- n)
(1- count)))
1))
(defun expr (n x)
(if (eq n 1)
(/ (pow (sqrt x)
3)
3)
(+ (expr (1- n) x)
(/
(* (pow -1 (1- n))
(pow (sqrt x )
(+ (* 2 n)
1))
(slayer 0.5
(1- n)))
(* (+ (* 2 n)
1)
(slayer (1- n)
(1- n)))))))
//上面用了技巧,(1/4)^(n/2)=(1/2)^n
这里不能用上面的方法了,需要用sqrt来实现。
(defun wrap (value)
(+ value
(/ (sqrt 3)
32)))
(* 48
(wrap (- (* 2 (expr 5 (- 0.5 (/ (sqrt 3) 4) )))
(* 2 (expr 5 0)))))
计算5项后能够精确到小数点后面第6位了。
(其实关于这个计算精度的问题不能完全这样看,首先计算机上有误差,另外关于计算多少项的问题,在试验的时
候就能发现次数高的,浮点数也会溢出,也就是说在单项中可能会做了更多的计算工作,并没有减少计算总量).