วันศุกร์แสนสนุก: Pi-romania
PS C:\> [math]::pi
3.14159265358979แต่ความสนุกในวันศุกร์นี้จะเป็นเรื่องเกี่ยวกับการเดินทางมากกว่าอย่างอื่น ฉันเริ่มต้นด้วยการค้นหาอัลกอริธึมที่ฉันสามารถใช้คำนวณพายได้ ฉันตัดสินใจใช้อัลกอริทึม Gauss-Legendre กระบวนการทั่วไปคือการวนซ้ำชุดสมการ แต่ละรอบจะทำให้คุณเข้าใกล้พายมากขึ้น
Pi จะถูกคำนวณดังนี้:
จากการวิจัยของฉัน ฉันรู้ว่าค่าเริ่มต้นควรเป็นเท่าใด ด้วยเหตุผลที่จะชัดเจนในอีกสักครู่ ฉันจึงกำหนดตัวแปรของฉันเป็นอาร์เรย์อย่างชัดเจน
$a = @(1)
$b = @(1/[math]::Sqrt(2))
$t = @(1/4)
$p = @(1)อย่างที่คุณเห็น ฉันยังต้องอาศัยคลาส [คณิตศาสตร์] สำหรับสิ่งต่างๆ เช่น รากที่สองของ 2 ตอนนี้เป็นส่วนที่สนุกแล้ว อัลกอริทึมจะวนซ้ำและแต่ละค่าที่ตามมาของตัวแปรจะขึ้นอยู่กับการคำนวณตัวแปรปัจจุบัน วิธีแก้ปัญหาของฉันคือใช้ For loop และรันสมการสำหรับตัวแปรแต่ละตัว ฉันยังตัดสินใจประเมินค่า pi ในแต่ละครั้งผ่านการวนซ้ำ เพื่อที่ฉันจะได้เห็นว่าตัวเองเข้าใกล้ได้แค่ไหน
for ($n=0;$n -lt 3;$n++) {
#each time through the array add a new value to each array using the += operator
$a+= ($a[$n]+$b[$n])/2
$b+= [math]::Sqrt(($a[$n]*$b[$n]))
$t+= $t[$n] - ($p[$n] * ([math]::Pow(($a[$n] - $a[$n+1]),2)))
$p+= 2*$p[$n]
([math]::Pow($a[$n+1] +$b[$n+1],2))/(4 *($t[$n+1]))
}สิ่งนี้ได้ผลดีเพราะ $n สามารถทำหน้าที่เป็นหมายเลขดัชนีสำหรับตัวแปรที่คำนวณแต่ละตัวได้ เพื่อที่ฉันจะได้ค่าที่ถูกต้องสำหรับการคำนวณขั้นสุดท้าย for วนซ้ำเริ่มต้นด้วย $n=0 และวนซ้ำในขณะที่ $n น้อยกว่าหรือเท่ากับ 3 แต่ละครั้งที่วนซ้ำ $n จะเพิ่มขึ้น 1 ($n++) คุณอาจสงสัยว่าทำไมฉันถึงเล่นวนซ้ำจนถึงตี 3 เท่านั้น นี่คือสิ่งที่จะเกิดขึ้นเมื่อฉันรันสคริปต์เล็กๆ น้อยๆ ของฉัน
PS C:\> Get-Pi.ps1
3.14057925052217
3.14159264621354
3.14159265358979ไม่ว่าฉันจะรันลูปอีกกี่ครั้ง ฉันจะไม่ได้ค่าที่แม่นยำไปกว่า 3.14159265358979 ซึ่งบังเอิญเป็นค่าเดียวกันกับ [คณิตศาสตร์]::pi ฉันคิดว่าอาจมีวิธีบังคับให้ PowerShell หรือ .NET ทำการคำนวณเป็นทศนิยมมากขึ้น แต่ดูเหมือนว่าจะเกินกว่าระดับการจ่าย .NET ของฉันเล็กน้อย แต่ฉันหวังว่าคุณจะเลือกบางอย่างเกี่ยวกับโครงสร้าง For หรืออาร์เรย์ และอย่าถามฉันเกี่ยวกับคณิตศาสตร์ ฉันสามารถเจาะตัวเลขได้ แต่ฉันไม่รู้ว่ามันหมายถึงอะไร แต่ฉันสนุกและหวังว่าคุณจะทำ


