เครื่องคิดเลข n7 ช่วยให้น้องๆ และนักเรียนทำการคำนวณเลขทศนิยมแบบแม่นยำได้
"n7 Arbitrary Precision Engine" เป็นชุดเครื่องมือคณิตศาสตร์ประสิทธิภาพสูงที่เปลี่ยน Arduino Zero ให้กลายเป็นตัวประมวลผลร่วมทศนิยมเชิงวิทยาศาสตร์ ไมโครคอนโทรลเลอร์ทั่วไปมักถูกจำกัดด้วยการคำนวณเลขทศนิยม 32 บิต ซึ่งนำไปสู่ข้อผิดพลาดจากการปัดเศษในงานคำนวณที่ซับซ้อน (มักจะเห็นชัดหลังจากความแม่นยำ 6-7 หลัก) โปรเจกต์ n7 ใช้ ไลบรารี Num7 ที่ออกแบบเองเพื่อทำการคำนวณเลข "Big Number" ทำให้ทั้งนักเรียนและวิศวกรสามารถคำนวณแฟกทอเรียล, รากที่สอง, และเปอร์เซ็นต์ทางการเงินได้ด้วยความแม่นยำที่แทบจะไม่จำกัด มีข้อจำกัดแค่จาก RAM ที่มีอยู่ในชิป SAMD21 เท่านั้น
เจาะลึกเทคนิค
- กลยุทธ์ความแม่นยำแบบไม่จำกัด:
- เกินกว่า 32 บิต: ไม่เหมือนตัวแปรมาตรฐาน Num7 เก็บข้อมูลตัวเลขเป็นอาร์เรย์หรือสตริงที่จองหน่วยความจำแบบไดนามิกส์ สิ่งนี้ป้องกันข้อผิดพลาด "Overflow" ที่พบบ่อยในการคำนวณ Arduino แบบมาตรฐาน
- ตรรกะทด-ยืม: การดำเนินการทางคณิตศาสตร์ (บวก, ลบ, ฯลฯ) จะถูกประมวลผลโดยใช้ตรรกะทีละหลักแบบที่มนุษย์คิด ซึ่งถูกโปรแกรมลงในซอฟต์แวร์ วิธีนี้ทำให้มั่นใจว่า $3.14159265...$ จะยังคงแม่นยำตลอดสายโซ่การคำนวณ
- แนวคิด DCS (Decimal Coprocessor Server):
- โปรเจกต์นี้แนะนำโมเดล การประมวลผลแบบกระจาย (Distributed Computing) คอมพิวเตอร์โฮสต์ที่รันสคริปต์ Python (
Arduino-n7-calc.py) จะส่งสตริงโจทย์คณิตศาสตร์ที่ซับซ้อนผ่าน Serial bridge ส่วน Arduino Zero ที่ทำหน้าที่เป็น "เซิร์ฟเวอร์" จะเป็นฝ่ายรับภาระการคำนวณความแม่นยำสูง แล้วส่งผลลัพธ์กลับมาเป็นสตริงข้อความ
- โปรเจกต์นี้แนะนำโมเดล การประมวลผลแบบกระจาย (Distributed Computing) คอมพิวเตอร์โฮสต์ที่รันสคริปต์ Python (
- การปรับแต่งให้เหมาะกับ SAMD21:
- เลือกใช้ Arduino Zero เพราะสถาปัตยกรรม ARM Cortex-M0+ 32 บิต ความเร็ว 48MHz ความเร็วสัญญาณนาฬิกาที่สูงขึ้นและรีจิสเตอร์ 32 บิตแบบเนทีฟนั้นจำเป็นมากสำหรับการประมวลผลอาร์เรย์ตัวเลขขนาดใหญ่ที่ต้องใช้ในการหารความแม่นยำสูง (สูงสุด 32+ ตำแหน่งทศนิยม)
- ฟังก์ชันขั้นสูง:
- คณิตศาสตร์การเงิน: มีฟังก์ชันเฉพาะทาง เช่น
spoff(หักภาษี/ส่วนลด) และpct(เปอร์เซ็นต์) ทำให้สามารถสร้างแบบจำลองทางเศรษฐกิจได้อย่างแม่นยำ โดยไม่มีข้อผิดพลาด "สตางค์หาย" จากการปัดเศษแบบเครื่องคิดเลขทั่วไป - ค่าคงที่ทางวิทยาศาสตร์: เอนจินนี้มีค่าที่คำนวณไว้ล่วงหน้าสำหรับ Pi และ e ซึ่งเก็บไว้ถึง 31 ตำแหน่งทศนิยม ทำหน้าที่เป็นมาตรฐานสำหรับการคำนวณตรีโกณมิติและการเติบโตแบบความแม่นยำสูงทั้งหมด
- คณิตศาสตร์การเงิน: มีฟังก์ชันเฉพาะทาง เช่น
การนำไปใช้และอินเทอร์เฟซคำสั่ง
- n7 CLI (Command Line Interface):
- ผู้ใช้โต้ตอบกับระบบผ่าน Serial Monitor (ตั้งค่าเป็น 115200 baud) เฟิร์มแวร์ใช้ตรรกะการแยกคำสั่งแบบขึ้นต้นด้วยคำนำหน้า พิมพ์
n7 ! 5เพื่อเรียกใช้ฟังก์ชันแฟกทอเรียล ส่วนn7 rnd 3.14159 2จะทำการปัดเศษโดยคำนึงถึงความแม่นยำให้เหลือสองตำแหน่งทศนิยม
- ผู้ใช้โต้ตอบกับระบบผ่าน Serial Monitor (ตั้งค่าเป็น 115200 baud) เฟิร์มแวร์ใช้ตรรกะการแยกคำสั่งแบบขึ้นต้นด้วยคำนำหน้า พิมพ์
- การเขียนโปรแกรมด้วย Num7:
- โปรเจกต์นี้สนับสนุนให้น้องๆ เลิกเล่นแค่ Serial Monitor แล้วไปต่อ ด้วยการ include ไลบรารี
<num7.h>นักพัฒนาสามารถนำตัวแปรความแม่นยำสูงไปรวมเข้ากับเครื่องมือทางการแพทย์, เครื่องบันทึกข้อมูล, หรือลูป PID ของหุ่นยนต์ได้โดยตรง ในกรณีที่ความละเอียดของ float มาตรฐานไม่เพียงพอ
- โปรเจกต์นี้สนับสนุนให้น้องๆ เลิกเล่นแค่ Serial Monitor แล้วไปต่อ ด้วยการ include ไลบรารี
- การปัดเศษและการจัดรูปแบบ:
- ไลบรารีมีโหมดการปัดเศษหลายแบบ:
rnd(มาตรฐาน),rndc(ปัดขึ้นเสมอ), และrndf(ปัดลงเสมอ) ทำให้ผู้ใช้ควบคุมเลขนัยสำคัญของผลลัพธ์ได้เต็มที่
- ไลบรารีมีโหมดการปัดเศษหลายแบบ:
- การแปลงเลขฐาน:
- คำสั่ง
bitsช่วยให้แปลงระหว่างเลขทศนิยมความแม่นยำสูงกับเลขฐานสองหรือฐานสิบหกได้ทันที ทำให้เป็นเครื่องมือที่มีค่าสำหรับนักเรียนวิทยาการคอมพิวเตอร์ที่กำลังศึกษาเรื่องการอ้างหน่วยความจำและโครงสร้างข้อมูล
- คำสั่ง
ใน Arduino IDE2 เปิดสเก็ตช์ n7_ZERO.ino ขึ้นมา ไปคลิกที่ไอคอนไลบรารี่ หาไลบรารี่ชื่อ num7 แล้วติดตั้งให้เรียบร้อยตามภาพตัวอย่างข้างล่างนี้เลยจ้า

จากนั้นก็อัพโหลดสเก็ตช์เข้าไปเลย ตั้งค่า Serial Monitor เป็น 115200 baud แล้วลองพิมพ์คำสั่ง n7 + 5 6 ตามตัวอย่างนี้

กด <enter> ไปเลยวัยรุ่น จะเห็นผลลัพธ์การคำนวณแบบเป๊ะๆ จาก Arduino แล้ว
ถ้าอยากลองลบ เช่น 3.14 - 2.72 ก็ให้พิมพ์แบบนี้

ถ้าอยากคูณเลขทศนิยม เช่น 3.14 x 2.72 ก็พิมพ์แบบนี้

และสำหรับการหาร 3.14 ด้วย 2.72 ให้พิมพ์: n7 : 3.14 2.72 แบบนี้

ถ้าอยากหาเศษจากการหาร (remainder) ให้พิมพ์ n7 mod 10.0 4.0 (อย่าลืมเติม .0 หลังจำนวนเต็มด้วยนะ) แบบนี้

ถ้าอยากปัดเศษมาตรฐาน (standard round) เช่น n7 rnd 1.1544117647058823529411764705882352941176 2 จะได้ 1.15 ที่มีทศนิยม 2 ตำแหน่ง แบบนี้

ถ้าอยากหาแฟกทอเรียล เช่น 5! ให้พิมพ์ n7 ! 5:

นอกจากนี้ n7 ยังสามารถรันผ่าน Command Line Interface (CLI) ได้ด้วยนะ โดยใช้ไคลเอนต์ Python Arduino-n7-calc.py และใช้ Arduino เป็น DCS (Decimal Coprocessor Server) แบบนี้เลย:


ยังมีฟังก์ชันคำนวณอื่นๆ อีกเพียบที่ทำได้ ตัวอย่างตามนี้เลยน้อง
addition: n7 + 2 3.5 #5.5
addition: n7 + 2 3.5 4.5 #10.0
subtraction: n7 - 2 3.5 #-1.5
subtraction: n7 - 2 3.5 4.5 #-6.0
multiplication: n7 x 2 3.5 4.5 #31.5
multiplication: n7 X 2 3.5 4.5 #31.5
multiplication: n7 '*' 2 3.5 4 #28.0
division: n7 / 120 2.0 5 #12.0
division: n7 / 2.5 3.5 #0.7142857142857142857142857142857142857142
division: n7 : 2.5 3.5 #0.7142857142857142857142857142857142857142
remainder: n7 % 17.0 10 4 #3.0
factorial: n7 ! 5 #120.0
absolute: n7 abs -5.0 #5.0
addition: n7 add 3.0 5.5 #8.5
ลบ: n7 sub 3.0 5.5 #-2.5
คูณ: n7 mul 3.0 5.5 #16.5
หาร: n7 div 3.0 5.5 6 #0.545454
เศษจากการหาร: n7 mod 10.0 7.0 #3.0
ส่วนกลับ: n7 inv 3.0 6 #0.333333
รากที่สอง: n7 sqr 2.0 6 #1.414213
กำลังสอง: n7 x2 5.0 #25.0
กำลังสาม: n7 x3 5.0 #125.0
ยกกำลัง: n7 xy 10.5 3.0 #1157.625
ยกกำลัง: n7 ^ 10.5 3.0 #1157.625
10 ยกกำลัง y: n7 10y 3.0 #1000.0
2 ยกกำลัง y: n7 2y 32.0 #4294967296.0
e ยกกำลัง y: n7 ey 1.0 #2.7182818284590452353602874713527
แฟกทอเรียล: n7 fact 5 #120.0
คูณด้วย 10: n7 10x 5.25 #52.5
คูณด้วย 100: n7 100x 5.25 #525.0
คูณด้วย 1000: n7 1000x 5.25 #5250.0
หารด้วย 10: n7 10div 5.25 #0.525
หารด้วย 100: n7 100div 5.25 #0.0525
หารด้วย 1000: n7 1000div 5.25 #0.00525
เลื่อนจุด: n7 shift 5.25 3.0 #5250.0
เลื่อนจุด: n7 shift 5.25 -3.0 #0.00525
เปอร์เซ็นต์: n7 pct 3.725 150.0 #5.5875
เปอร์มิล: n7 pth 2.0 24_000.0 #48.0
spin-off: n7 spoff 22.0 1_299.0 #1064.75409836065573770491803278688524
spin-on: n7 rnd $(n7 spon 22.0 1_064.75) #1299.0
ปัดเศษ: n7 rnd 3.141592654 4 #3.1416
ปัดเศษ (ตัดทิ้ง): n7 rndb 3.14159265 7 #3.1415926
ปัดเศษขึ้น: n7 rndc 3.141592654 #4.0
ปัดเศษลง: n7 rndf 3.74 #3.0
ผลรวม: n7 sum 3.74 0.26 4 2.0 #10.0
ค่าต่ำสุด: n7 min 3.74 0.26 4 2.0 #0.26
ค่าสูงสุด: n7 max 3.74 0.26 4 2.0 #4.0
ค่าเฉลี่ย: n7 mean 3.74 0.26 4 2.0 #2.5
ค่าคงตัว e: n7 e #2.7182818284590452353602874713527
ค่าคงตัว π: n7 pi #3.1415926535897932384626433832795
exp: n7 exp 200.0e-5 #200.0e-5
สัญกรณ์วิทยาศาสตร์: n7 sci 200.0e-5 #2.0e-3
แสดงเป็นบิต: n7 bits 10.0 #1010
แสดงเป็นบิต: n7 bits 65535.0 0 #FFFF
มากกว่า: n7 gt -5.0 -4.0 #0
มากกว่าหรือเท่ากับ: n7 ge -6.0 -6.0 #1
น้อยกว่า: n7 lt -5.0 0.0 #1
น้อยกว่าหรือเท่ากับ: n7 le -5.0 -5.0 #1
เท่ากัน: n7 eq -5.0 0.0 #0
ไม่เท่ากัน: n7 ne -5.0 0.0 #1
เป็นศูนย์: n7 is_zero 0.0 #1
เป็นบวก: n7 is_pos 1.0 #1
เป็นลบ: n7 is_neg -1.0 #1
เป็นเลขคู่: n7 is_even 3.0 #0
เป็นเลขคี่: n7 is_odd 2.0 #0
เป็นจำนวนเต็ม: n7 is_int -2.1 #0
เป็นจำนวนเฉพาะ: n7 is_prime +3.0 #1
อัพเกรดการบ้านเลขโรงเรียนจากคณิตศาสตร์พื้นฐาน สู่การคำนวณวิศวกรรมที่แม่นยำด้วย n7 Decimal Coprocessor กันเถอะน้อง!