Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Вычисление числа ПИ по итерационной формуле (http://forum.oszone.net/showthread.php?t=335053)

daniil_im 27-05-2018 21:06 2815817

Вычисление числа ПИ по итерационной формуле
 
Вложений: 1
В общем вот формула и код, вариант 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 2815819

Цитата:

Цитата daniil_im
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 2815821

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

daniil_im 27-05-2018 22:13 2815829

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 2815868

daniil_im, Вместо Time используйте Timer, чтобы получить внятное время в секундах.
Iska,
Оптимизация кода дала всего-то 10% выигрыша по времени
Код:

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 2815869

Цитата:

Цитата megaloman
Iska, Оптимизация кода дала всего-то 10% выигрыша по времени »

Одна старушка, конечно, гривенник, но из таких вот мелочей складывается общая эффективность.


Время: 06:22.

Время: 06:22.
© OSzone.net 2001-