Apollo 11 คำนวณค่า sin กับ cos ด้วยแค่การบวกลบคูณหารยังไง
ผมไปเจอทวิตนี้ของ @fermatslibrary ซึ่งผมเห็นว่าน่าสนใจดี เลยอยากเอามาขยายความให้ฟัง
In 1969 Apollo 11, the spaceflight that first landed humans on the Moon, used these 30 lines of code to calculate transcendental functions like sine and cosine essential for navigation.
— Fermat's Library (@fermatslibrary) April 9, 2026
Annotated code here: https://t.co/5cOQHlATbB pic.twitter.com/s4hn2EOmGS
เกริ่นนิดนึงก่อนว่า Apollo 11 คือภารกิจอวกาศในปี 1969 ที่พามนุษย์ไปลงจอดบนดวงจันทร์เป็นครั้งแรก ซึ่งมันไม่ได้มีแค่ความท้าทายด้านวิศวกรรมเครื่องยนต์หรือโครงสร้างยาน แต่ยังรวมถึงระบบนำทางที่ต้องคำนวณตำแหน่ง ความเร็ว และทิศทางของยานอย่างแม่นยำตลอดเวลา
ซึ่งถ้านึกถึงตอนเรียนฟิสิกส์ดู จะรู้ว่าในสูตรมันมีตรีโกณมิติเยอะไปหมด ดังนั้นการทำให้คอมพิวเตอร์สามารถคำนวณค่า sine กับ cosine ได้จึงเป็นเรื่องสำคัญมาก และวิธีการคำนวณค่า sine กับ cosine ในสมัยนั้นนั้นน่าสนใจทีเดียว
แล้วเรารู้ได้ยังไงว่าสมัยนั้นเขาคำนวณ sine กับ cosine กันยังไง
เรื่องคือ มีคนใจดีรวบรวมโค้ดต้นฉบับของระบบนำทางจาก Apollo 11 ซึ่งถูกนำมาดิจิไทซ์จากเอกสารกระดาษจริงในยุคปี 1969 โดยโค้ดเหล่านี้มาจากคอมพิวเตอร์ที่เรียกว่า Apollo Guidance Computer (AGC) ซึ่งเป็นหัวใจของระบบนำทางของยาน โค้ดทั้งหมดไม่ได้ถูกเขียนขึ้นใหม่ แต่เป็นการถอดมาจากเอกสารต้นฉบับที่เก็บไว้ใน MIT Museum
ตัวโค้ดเขียนด้วยภาษา assembly ของ AGC ซึ่งเป็นภาษา low-level ที่ต้องควบคุมการทำงานของเครื่องโดยตรง ไม่มีฟังก์ชันสำเร็จรูปเหมือนภาษาในปัจจุบัน โค้ดชุดนี้ถูกพัฒนาโดยทีมจาก MIT Instrumentation Laboratory ภายใต้สัญญากับ NASA และมีบุคคลสำคัญอย่างคุณมาร์กาเร็ต เอช. แฮมิลตันเป็นหัวหน้าทีมเขียนโปรแกรม พร้อมทั้งผ่านการตรวจสอบและอนุมัติโดยผู้รับผิดชอบโครงการในเวลานั้น
เรื่อง sine กับ cosine ที่ทวิตต้นทางพูดถึงนั้นอยู่ในไฟล์ชื่อ SINGLE_PRECISION_SUBROUTINES.agc โดยพวกเขาเริ่มต้นจากสมบัติทางตรีโกณมิติง่าย ๆ ที่ว่า

ดังนั้น ถ้าเราสามารถสร้างฟังก์ชันสำหรับคำนวณค่า sin ได้ เราก็สามารถคำนวณค่า cos ได้ทันที เพราะฉะนั้น เขียนโปรแกรมคำนวณค่า sin ก็พอ

ต่อมา แม้ว่าฟังก์ชัน sine จะนิยามบนจำนวนจริงทั้งหมด แต่เรารู้ว่ามันเป็นฟังก์ชันที่มีคาบ แปลว่าเราไม่จำเป็นต้องคำนวณค่า sin ให้ได้ทุกค่า แค่คำนวณในช่วงเดียวให้ได้ แล้วใช้สมบัติตรีโกณมิติยุบมุมเข้ามา เหมือนกับตอนเรียนในตรีโกณ ม.5 สุดท้ายจะลดปัญหาเหลือแค่การคำนวณค่า sin ในช่วง −π/2 ถึง π/2 เท่านั้น

ในโค้ดจริง ๆ นั้นเขามีการปรับช่วงนิดนึง คือเปลี่ยนตัวแปรจาก x เป็น xπ/2 เพื่อให้ช่วงกลายเป็น [-1,1] แต่นั่นก็ไม่เปลี่ยนสาระสำคัญอะไร
เมื่อเราลดปัญหาจนเหลือแค่การคำนวณค่า sin ในช่วงสั้น ๆ ได้แล้ว และด้วยข้อจำกัดที่คอมพิวเตอร์ทำได้แค่บวก ลบ คูณ หาร พวกเขาจึงต้องประมาณฟังก์ชัน sine ด้วยพหุนาม และวิธีที่ง่ายที่สุดก็คือใช้ Taylor series
ขุดความรู้แคลคูลัส 2 กันหน่อย Taylor series คือเครื่องมือที่เปลี่ยนฟังก์ชันหน้าตาแปลก ๆ รวมทั้งตรีโกณมิติ ให้กลายเป็นพหุนาม อย่าง sine ก็คือ

หรือปรับช่วงแล้วเป็น

ซึ่งทำให้คำนวณได้ด้วยแค่การบวก ลบ คูณ หาร
คำถามคือจะใช้กี่พจน์ดีล่ะ คือยิ่งใช้มากมันก็จะยิ่งแม่นแหละ แต่มันจะคำนวณซับซ้อนขึ้นตามไปด้วย
แต่ๆๆๆๆๆๆๆ ต้องไม่ลืมว่า เราไม่ได้ต้องการแม่นทั้งฟังก์ชันนี่นา เราต้องการแค่ช่วง [−1, 1] เท่านั้น ซึ่งในช่วงนี้ การใช้แค่ไม่กี่พจน์ก็เริ่มให้ความแม่นยำที่ใช้ได้แล้ว
ดูกราฟข้างล่างสิฮะ เส้นประสีดำคือกราฟ sine ของจริง เส้นทึบสีแดงคือประมาณด้วยสองพจน์ และเส้นทึบสีส้มคือสามพจน์ ซึ่งจะเห็นว่ามันแทบจะแนบไปกับเส้น sin จริง ๆ เลย

แต่ Taylor series มีจุดอ่อนสำคัญคือ มันจะแม่นมากบริเวณใกล้จุดศูนย์กลาง และจะค่อย ๆ ไม่แม่นเมื่อออกห่าง โดยเฉพาะบริเวณขอบช่วงอย่าง ±π/2 ถ้าซูมดูจะเห็นว่าเส้นพหุนามเริ่มเบี่ยงออกจากกราฟ sin จริงเล็กน้อย เล็กน้อยแบบนิดเดียวจริง ๆ

แต่ error เล็กน้อยนี้ก็สำคัญ เพราะถ้ามีการคำนวณซ้ำ ๆ หลายครั้ง ความคลาดเคลื่อนเล็กน้อยพวกนี้อาจสะสมกันจนเยอะ และส่งผลต่อการนำทางได้
สิ่งที่น่าสนใจคือ ถ้าไปดูในโค้ดจริง จะพบว่า NASA ไม่ได้ใช้ Taylor series แบบตรง ๆ แต่ใช้พหุนามที่หน้าตาคล้ายกัน โดยปรับค่าสัมประสิทธิ์เล็กน้อย
ในไฟล์ FIXED_FIXED_CONSTANT_POOL.agc จะเห็นว่าค่าคงที่ที่ใช้จริงนั้นใกล้กับ Taylor มาก แต่ไม่ตรงกันเป๊ะ พวกเขาประมาณ sin(xπ/2) ด้วย

การปรับเล็กน้อยนี้ช่วยลด error บริเวณขอบช่วง และทำให้ความแม่นยำกระจายดีขึ้นทั้งช่วง ไม่ได้กระจุกอยู่แค่ตรงกลาง อย่างที่เห็นในรูปข้างล่าง

แล้วค่าสัมประสิทธิ์พวกนี้มาจากไหน ในโค้ดไม่ได้อธิบายไว้ชัดเจน แต่เดาเอาเองว่าน่าจะใช้ numerical optimization หาค่าที่ทำให้ error โดยรวมต่ำที่สุด หรืออะไรทำนองนั้น
เรื่องนี้สะท้อนภาพการแก้ปัญหาของมนุษย์ภายใต้ข้อจำกัดได้อย่างชัดเจน
ในยุคของ Apollo 11 ที่มีข้อจำกัดทางการคำนวณอย่างมากเมื่อเทียบกับปัจจุบัน แต่ด้วยความรู้ทางคณิตศาสตร์และการออกแบบที่ชาญฉลาด มนุษย์ก็ยังสามารถพากันไปถึงดวงจันทร์ได้
ทุกวันนี้เราอาจมีวิธีคำนวณฟังก์ชัน sine ที่เร็วและแม่นยำกว่านี้แล้ว แต่เราก็ยังต้องเผชิญกับปัญหาที่ซับซ้อนขึ้นเรื่อย ๆ และคณิตศาสตร์ก็ยังคงต้องพัฒนาไป เพื่อตอบสนองความทะเยอทะยานที่ไม่มีวันสิ้นสุดของมนุษย์ให้ทัน
และเช่นเดิม ใครที่อยากสนับสนุนเพจเว็บไซต์ของเรา ให้ผลิตคอนเทนต์คณิตศาสตร์แบบนี้ต่อไป ก็สามารถสมัครเป็นสมาชิกรายเดือนได้โดยกดปุ่ม 'สมัครสมาชิก' ได้เลยนะฮะ
เอกสารอ้างอิง
https://x.com/fermatslibrary/status/2042197982506828161
https://fermatslibrary.com/s/apollo-11-implementation-of-trigonometric-functions
https://github.com/chrislgarry/Apollo-11/tree/27e2acf88a6345e2b1064c8b006a154363937050