PDA

Показать полную графическую версию : [решено] Вычисление числа ПИ по итерационной формуле


daniil_im
27-05-2018, 21:06
В общем вот формула и код, вариант 9, вычисляет число ПИ он не правильно. Не могу понять что я не так делаю

eps = 1+(1e-9)
a = 2
s = 1
n = 0
t2 = Time
Do While Abs(a)>eps
a = ((4/8*n+1)-(2/8*n+4)-(1/8*n+5)-(1/8*n+6))*((1/16)^n)
s = s*a
n = n+1
Loop
t2 = Time-t2
MsgBox "Значение Pi = " & s*2 & vblf & "n= " & n & vblf & "Расчетное время= " & t2 & vbfl

mwz
27-05-2018, 21:11
a = ((4/8*n+1)-(2/8*n+4)-(1/8*n+5)-(1/8*n+6))*((1/16)^n) »

Должно ж быть однако
((4/(8*n+1))-(2/(8*n+4))-<и т.д.>)
т.е. знаменатели в скобках.

Да и члены ряда можно в скобки не брать:

(4/(8*n+1)-2/(8*n+4)-<и т.д.>)

Iska
27-05-2018, 21:22
И вычисление 8*n стоит вынести в отдельную переменную, всё хлеб. Равно как и 1/16.

daniil_im
27-05-2018, 22:13
Iska, спасибо но проблема была в другом)

eps = 1e-8
a = 1
s = 0
n = 0
t2 = Time
Do While Abs(a)>eps
a = ((4/(8*n+1)) - (2/(8*n+4)) - (1/(8*n+5)) - (1/(8*n+6)))*(1/16)^n
s = s+a
n = n+1
Loop
t2 = Time-t2
MsgBox "Значение Pi = " & s & vblf & "n= " & n & vblf & "Рассчетное время= " & t2 & vbfl

megaloman
28-05-2018, 08:25
daniil_im, Вместо Time используйте Timer, чтобы получить внятное время в секундах.
Iska, t2 = Timer

For i=1 to 1000000 '-------------------------------

eps = 1.e-8
s = 0
n = -7
n16=16

Do
n = n + 8
n16 = n16 * 0.0625
a = (4/n - 2/(n+3) - 1/(n+4) - 1/(n+5))*n16
s = s + a
Loop While Abs(a)>eps

Next '-------------------------------

t2 = Timer - t2
MsgBox "Значение Pi = " & s & vblf & "n= " & CStr((n-1)/8) & vblf & "Рассчетное время= " & t2 & vbflЦикл For вставил для того, чтобы получилось внятное значение времени для сравнения

Iska
28-05-2018, 08:31
Iska, Оптимизация кода дала всего-то 10% выигрыша по времени »
Одна старушка, конечно, гривенник, но из таких вот мелочей складывается общая эффективность.




© OSzone.net 2001-2012