วันนี้ผมจะพูดถึงข้อจำกัดในการคำนวณในทางคณิตศาสตร์เวลาที่เราเขียนโปรแกรม โดยยกสองตัวอย่างนี้ขึ้นมา

  • 1/0
  • sqrt(-1)

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

cout << 1/0  ;

คอมไพล์เลอร์จะแจ้งเตือนว่า division by zero (หมายถึงหารด้วย 0) เช่นตัวนี้ผมคอมไพล์บนวินโดวส์โดยใช้ GCC 4.9.2 มันจะแจ้งเตือนเป็นข้อความว่า

97 11 C:\Users\user\Desktop\OR_Solver\main.cpp [Warning] division by zero [-Wdiv-by-zero]

หมายถึงบรรทัดที่ 97 คอลัมน์ที่ 11 มีการหารด้วย 0

ซึ่งการแจ้งเตือนของมันคือคอมไพล์ผ่านนะครับ แต่ว่าเวลารันโปรแกรมจะตายทันที(ทั้งนี้แล้วแต่คอมไพลเลอร์หรือ IDE ที่ใช้นะครับ)

คราวนี้ลองเป็นลักษณะอินพุตจากผู้ใช้บ้าง จากตัวอย่างต่อไปนี้ครับ

int input1 ,input2 ;
cout << “Input 1 : ” ;
cin >> input1;
cout << “Input 2 : ” ;
cin >> input2;
cout << input1/input2 << endl;

ตรงนี้เวลาคอมไพล์ ตัว compiler จะไม่รู้กับเราว่าอาจจะมี การหารด้วย 0 เกิดขึ้น ซึ่งมันจะไม่เตือนให้เราทราบใดๆ เลยครับ(คอมไพล์ผ่านฉลุย)

ตัวอย่างการรันเมื่อ เลขตัวที่ 2 เป็น 0 นะครับ

Input 1 : 2
Input 2 : 0
inf

จะเห็นว่ามันจะออกมาเป็นค่า inf หรือ infinity ซึ่งหมายถึงเลขที่มีค่าเป็นอนันต์(ไม่มีที่สิ้นสุด) ครับ

คราวนี้ลองมาดูการถอดแสควร์รูทของตัวเลขติดลบบ้างว่าคอมไพล์เลอร์มันว่ายังไง

cout << sqrt(-1) << endl;

ตัวนี้คอมไพล์ผ่าน แต่ไม่แจ้งเตือนใดๆ  ทดลองรันดูเอาท์พุตเป็นค่านี้ครับ

nan

คำว่า nan ในที่นี้หมายถึง Not A Number ครับ ถ้าเป็นคณิตศาสตร์ รากที่ 2 ของค่าลบจะเป็นจำนวนจินตภาพ ซึ่งผมขอนำโครงสร้างของจำนวนจริงมาแปะไว้ให้ดูเผื่อใครไม่รู้จำนวนจินตภาพคืออะไร สนใจคณิตศาสตร์เพิ่มเติมก็ตามลิงค์ไปเลยนะครับ วันนี้ขอจบเพียงเท่านี้ก่อน 😀

เครดิตภาพ : http://vichakarn.triamudom.ac.th/comtech/studentproject/final54/824/Infinite%20Stratos/MATH/Real.html

Advertisements

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s