PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   七嘴八舌異言堂 (https://www.pcdvd.com.tw/forumdisplay.php?f=12)
-   -   vb6高手求教?圓周率的程式如何寫呢? (https://www.pcdvd.com.tw/showthread.php?t=730530)

eric2377 2007-07-08 08:18 PM

幾千位的確可以很快就算完了
不過精確度可能很差
只能說是近似值而已吧

誰找我 2007-07-09 12:10 PM

可以節省42%的時間,參考看看... :ase

程式內容:
method1是分開算的,加法和減法分開,最後加在一起,
method2是原本的
最後有列印出,計數method1和method2的計算時間...

代碼:
Private Sub Form_Load()
Dim pi  As Variant
Dim i   As Long 'Single
Dim j  As Variant
Dim k  As Variant
Dim Start, Finish, TotalTime

pi = 0
j = 0
k = 0

If (MsgBox("Press Yes to start for pi calculation", 4)) = vbYes Then

'=============method1(divide calculate)====================
Start = Timer
For i = 0 To 10000000 '2147483646

    j = j + CDec(1 / (4 * i + 1))

Next i

For i = 1 To 10000000

    k = k - CDec(1 / (4 * i - 1))
    
Next i

pi = j + k
pi = 4 * CDec(pi)

Finish = Timer
TotalTime = Finish - Start

Debug.Print "method1:" & pi
Debug.Print "method1 time:" & TotalTime

'=============method2(original)====================
pi = 0
Start = Timer
For i = 0 To 20000000 '2147483646

    pi = pi + CDec(1 / (2 * i + 1) * (-1) ^ i)
     
Next i

pi = 4 * CDec(pi)

Finish = Timer
TotalTime = Finish - Start

Debug.Print "method2:" & pi
Debug.Print "method2 time:" & TotalTime

Else
    End
End If
End Sub

=風= 2007-07-09 08:31 PM

引用:
作者誰找我
可以節省42%的時間,參考看看... :ase

程式內容:
method1是分開算的,加法和減法分開,最後加在一起,
method2是原本的
最後有列印出,計數method1和method2的計算時間...


Private Sub Form_Load()
Dim pi As Variant
Dim i As Long 'Single
Dim j As Variant
Dim k As Variant
Dim Start, Finish, TotalTime

pi = 0
j = 0
k = 0

If (MsgBox("Press Yes to start for pi calculation", 4)) = vbYes Then

'=============method1(divide calculate)====================
Start = Timer
For i = 0 To 10000000 '2147483646

j = j + CDec(1 / (4 * i + 1))

Next i

For i = 1 To 10000000

k = k - CDec(1 / (4 * i - 1))

Next i

pi = j + k
pi = 4 * CDec(pi)

Finish = Timer
TotalTime = Finish - Start

Debug.Print "...

嗯!不錯。
稍微改變一下方式
節省不少的時間 :)

誰找我 2007-07-09 09:27 PM

改良一下下
pi=0
pi=cdec(pi)
這樣pi就轉型成功了

然後
在迴圈這部分
pi = pi + CDec(1 / (2 * i + 1) * (-1) ^ i)
拿掉cdec()
變成
pi = pi + 1 / (2 * i + 1) * (-1) ^ i

這樣執行出來結果不變,而且速度會再加快10%左右
因為cdec()會拖累速度,每次迴圈都用到,會變慢...
就先給它轉型了...
---

=風= 2007-07-10 06:44 AM

引用:
作者誰找我
改良一下下
pi=0
pi=cdec(pi)
這樣pi就轉型成功了

然後
在迴圈這部分
pi = pi + CDec(1 / (2 * i + 1) * (-1) ^ i)
拿掉cdec()
變成
pi = pi + 1 / (2 * i + 1) * (-1) ^ i

這樣執行出來結果不變,而且速度會再加快10%左右
因為cdec()會拖累速度,每次迴圈都用到,會變慢...
就先給它轉型了...
---

這麼有興趣還在研究嗎?
CDec的用意是在更精確至小數28位數
只是以目前這個程式
執行效率這麼差
跑至正確的小數位十位的話
可能要一天了
所以CDec不用也沒關係 :)


所有的時間均為GMT +8。 現在的時間是11:42 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2026。