ว่ากันด้วยเรื่องของ Bug ภาค 2

 ว่าด้วย เรื่องของ Bug ภาค 2

ก่อนที่จะได้โพสเกี่ยวกับ Full Moon สุดท้ายของปี 2564 นี้ ได้พบกับความยากลำบากเนื่องจากไปเจอ Bug ของโปรแกรมตัวเอง(อีกแล้ว) แถมรอบนี้ หาที่ผิดไม่เจออีกด้วยต่างหาก เพราะไล่ตรวจโค้ด โค้ดมันก็ถูกทุกอย่าง แต่ไหงคำตอบมันออกมาเพี้ยนได้แบบสุดกู่ได้ล่ะ!!! ที่ประหลาดใจกว่านั้นอีก ก็คือ ชุดโค้ดในแบบ commandline ผ่าน nodejs กลับแสดงผลได้อย่างถูกต้อง ไม่ผิดเพี้ยน ขณะที่ในแบบ GUI นั้นไม่!!! อะไรกันนี่!!!! (สันนิษฐานได้เลยว่า ต้องทำอะไรผิดไว้แน่ๆ แต่แค่ยังหาไม่เจอเท่านั้น แน่นอน!!!)
เมื่อทุกอย่างงวดเข้ามา จนกระทั่งช่วงก่อนเที่ยงคืนของวันที่ 18 ต่อวันที่ 19 ธันวาคม 2564
เพื่อให้ได้ข้อมูลทำโพสของ Full Moon เลยตัดสินใจ ใช้ข้อมูลผ่านชุดโค้ดของ Commandline ทำงานร่วมกับ compiler online ในระบบอินเตอร์เน็ตแทนไปพลางก่อน และเข็นออกมาจนได้ในที่สุด
แต่มันก็ยังคงคาใจอยู่ดี มันผิดที่ตรงไหนกันนี่
กระทั่งช่วงเช้าของวันนี้(19/12/2021) ทุกอย่างจึงมาถึงบางอ้อ
สาเหตุที่ทำให้ผิด มีอยู่ไม่กี่เรื่อง
เรื่องแรก ก็คือ ขั้นตอนสำหรับการคำนวณ มันมีความลักลั่นอยู่ ทั้งในขั้นของการคำนวณและแสดงผล
ส่วนเรื่องที่สอง เกิดจากฟังก์ชั่นที่ใช้จัดรูปแบบการแสดงผลคำนวณดังกล่าว
จากการตรวจสอบ พบว่า เมื่อเราให้โปรแกรมทำการคำนวณ พร้อมแสดงผล มีการใช้ค่าต่อเนื่องกันจากตัวแปรหนึ่งถึงอีกตัวแปรหนึ่ง โดยที่ระหว่างนั้น เราก็ทำการแสดงผลให้มันพร้อมกันไปด้วย
ประเด็นก็คือ ฟังก์ชั่นที่ใช้จัดรูปแบบการแสดงผลดังกล่าวนั้น เป็นการจัดการในแบบตัวอักษร(แต่เอาไปคำนวณได้นะ) ซึ่งลักษณะเหตุการณ์แบบนี้ จะไม่เกิดขึ้นกับภาษาโปรแกรมแบบที่กำหนดชนิดของตัวแปรล๊อคเอาไว้เลยตั้งแต่เริ่ม แต่หากเป็นภาษาโปรแกรมแบบไม่กำหนดชนิดตัวแปร เตรียมทำใจไว้ได้เลยว่าต้องเกิดเหตุการณ์แบบนี้ขึ้นแน่นอน ไม่วันใดก็วันหนึ่ง
จากเหตุดังกล่าว ส่งผลให้ค่าที่นำเอาไปใช้งานต่อ มีลักษณะปนกันระหว่างตัวเลขและตัวอักษรที่ถึงแม้จะนำไปคำนวณผลต่อออกมาได้ แต่ก็ดูจะสุ่มเสี่ยงต่อการเกิดความผิดพลาดได้แน่ๆ และก็เกิดขึ้นจริงๆกับรอบ FullMoon ของเดือนธันวาคม 2564

แนวทางแก้ไขปัญหา
ในที่นี้ เน้นกลับไปที่หัวใจหลักของโปรแกรมคือ ปรับที่ขั้นตอนการคำนวณ โดยทำการปรับเปลี่ยนให้คำนวณทุกค่าตามขั้นตอนที่ต้องการให้ได้ทั้งหมดก่อน ต่อจากนั้น ค่อยใช้ฟังก์ชั่นการแสดงผลช่วยในการจัดรูปแบบของผลลัพธ์ต่อไป เป็นการแยกการทำงานอย่างชัดเจนระหว่างชุดตัวแปรที่แทนตัวเลขกับผลคำนวณที่ได้ ซึ่งจะนำไปใช้ต่อกับฟังก์ชั่นการจัดแสดงผลอีกต่อหนึ่งซึ่งจะกลายเป็นตัวอักษรโดยให้ถือเป็นผลลัพธ์สุดท้าย ลดความสับสนไปได้ในระดับหนึ่ง

ข้อคิดเห็นเพิ่มเติม(Additional)
ตรงนี้ไม่เกี่ยวกับ Bug แต่เป็นเรื่องของขบวนค่าแก้ต่างๆ
จากเดิมที่พบเจอว่า การคำนวณแบบของ Jean Meeus ที่ใช้ตาม J2000 พร้อมค่าแก้ 6 ค่าหลักนั้น อาจจะให้ค่าที่ไม่ละเอียดมากนัก เลยลองทำเป็น 25 ตัวแก้ดู ผลปรากฏว่า บางครั้ง ผลลัพธ์ที่ได้ มีทั้งมากกว่า หรือน้อยกว่า ค่าที่พบเห็นอยู่ตามแหล่งข้อมูลดาราศาสตร์ทั่วๆไปในระดับหนึ่ง ดูน่าแปลกใจดี ยิ่งไปกว่านั้น หากมีการเพิ่มหรือลดจำนวนค่าแก้ ซึ่งมีตั้งแต่ 8 9 10 12 ตัว เป็นต้น พบว่า ผลลัพธ์ที่ได้ ก็มีทั้งมากกว่าหรือน้อยกว่า ค่าที่พบเจอจากแหล่งข้อมูลทางดาราศาสตร์ในระดับหนึ่งเช่นเดียวกัน
ฉะนั้น เพื่อความง่ายและสะดวก สูตร J2000 ของ Jean Meeus จะขอคงไว้ที่ ค่าแก้ 6 ตัวก่อนจะดีกว่า ส่วนจะเน้นความละเอียด มากน้อย อย่างไร ค่อยพิจารณากันไปตามแต่ละกรณีจะดีกว่า
สำหรับสูตรยุคหิน J1900 นั้น หากไม่นับปัญหาการแสดงผลผิดพลาดแล้ว ในเรื่องของขั้นตอนการคำนวณนับว่า ไม่มีความยุ่งยากซับซ้อนใดๆมากนัก แถมยังมีค่าที่ใกล้เคียงกับแหล่งข้อมูลทางดาราศาสตร์ในหลายๆแหล่งด้วยเช่นเดียวกันอย่างน่าประหลาดใจ สามารถนำเอาไปใช้งานได้เป็นอย่างดีเช่นกัน
ขอจบมันดื้อๆแบบนี้แหละ หากจะนำไปใช้คำนวณ FullMoon ทั้งหมดทั้งมวล สูตรก็รู้สึกว่าจะมีกันอยู่แค่นี้ น่าจะพอเอาไปเป็นแนวทางในการทำอะไรกันได้บ้างอยู่ล่ะนะ ลาล่ะ สวัสดี.

 
 


ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

รวบรวมสมการสุริยยาตร์ ตอนที่ 2 ภาคสมการสมผุส

Julian Date หรรษา

กรณีศึกษา การทดสอบใช้สมการสุริยยาตร์ หาสมผุสดาวพฤหัสบดี และ ดาวเสาร์