ข้อยกเว้นจุดลอยตัว เกิดขึ้นเมื่อซอฟต์แวร์พยายามดำเนินการที่ไม่เหมาะสมกับตัวเลขตัวเลข ข้อยกเว้นประเภทนี้เกิดขึ้นเมื่อผู้ใช้พยายามดำเนินการที่ไม่ถูกต้อง เช่น การหารด้วยศูนย์ การหารจำนวนลบด้วยจำนวนคู่ การหารากที่สองของจำนวนลบ หรือการโอเวอร์โฟลว์ของการคำนวณที่เกินขีดจำกัดของประเภทข้อมูลคู่
ในภาษา C++ “SIGFPE” ตัวจัดการสัญญาณจัดการ ข้อยกเว้นจุดทศนิยม (FPE) เมื่อผู้ใช้พยายามดำเนินงานดังกล่าว ตัวจัดการสัญญาณนี้จะถูกเรียก เมื่อตัวจัดการสัญญาณเข้ามาแทรกแซง จะพิมพ์ข้อความแสดงข้อผิดพลาดไปยังเอาต์พุตมาตรฐานและหยุดโปรแกรม
เหตุใดจึงมีข้อยกเว้นจุดลอยตัวจึงเกิดขึ้น
ข้อยกเว้นจุดลอยตัว อาจเกิดขึ้นได้เนื่องจากข้อผิดพลาดในการเขียนโปรแกรมหรือเมื่อโปรแกรมพยายามประมวลผลค่าที่ไม่เป็นไปตามข้อกำหนด ตัวอย่างเช่น หากโปรแกรมพยายามหารจำนวนเต็มด้วยศูนย์ หรือหากโปรแกรมพยายามหาค่ารากที่สองของจำนวนลบ ข้อยกเว้นจุดทศนิยม จะเกิดขึ้น นอกจากนี้ ข้อยกเว้นจุดลอยตัว บางประการ สามารถเกิดขึ้นได้เนื่องจากการตรวจจับโปรเซสเซอร์ผิดพลาด
ปัจจัยหลายประการ เช่น การดำเนินการที่ไม่เหมาะสม อันเดอร์โฟลว์ โอเวอร์โฟลว์ การหารด้วยศูนย์ และความแม่นยำ อาจส่งผลให้เกิดข้อยกเว้นจุดลอยตัว . เราจะกล่าวถึงข้อโต้แย้งเหล่านี้ทีละข้อในส่วนนี้
1:การดำเนินการที่ผิดกฎหมาย
เมื่อผู้ใช้ลืมแสดงการดำเนินการหรือการดำเนินการไม่มีค่าทางคณิตศาสตร์ โปรแกรมจะล้มเหลวในการดำเนินการเนื่องจากการดำเนินการที่ไม่ถูกต้อง ซึ่งรวมถึงการคำนวณ เช่น รากที่สองและลอการิทึมของจำนวนลบ เป็นต้น แม้ว่าจะเป็นไปได้ที่จะหารากที่สองของจำนวนลบเมื่อต้องจัดการกับจำนวนเชิงซ้อน แต่ไม่มีกลไกทางคอมพิวเตอร์ใดที่จะแสดงออกได้
นอกจากนี้ การดำเนินการที่ไม่ถูกต้องจะส่งผลหากซอฟต์แวร์ดำเนินการ จุดลอยตัว การดำเนินการบนตำแหน่งที่เป็นจำนวนเต็มเท่านั้น นี่เป็นเพราะความไม่ตรงกันระหว่างการดำเนินการที่คุณพยายามดำเนินการกับข้อมูล (การดำเนินการจุดทศนิยม) และข้อมูลที่เก็บไว้ (จำนวนเต็ม)
2:การหารเป็นศูนย์
ข้อยกเว้นจุดลอยตัว จะถูกโยนทิ้งไปหากคุณพยายามหารจำนวนเต็มด้วยศูนย์ สิ่งเดียวกันนี้เกิดขึ้นเมื่อคุณพยายามหารด้วย NaN หรืออนันต์ นี่คือตัวอย่างบางส่วน:1/0, log(0)
3:ล้น
เมื่อการดำเนินการส่งคืนค่าที่อยู่นอกช่วงที่คาดไว้ จะเกิดข้อยกเว้นการโอเวอร์โฟลว์ ค่าจะมากกว่าหรือต่ำกว่าค่าที่เป็นตัวแทนได้น้อยที่สุด ตามคำสั่งนี้
4:อันเดอร์โฟลว์
อันเดอร์โฟลว์เกิดขึ้นเมื่อการคำนวณให้ผลลัพธ์ที่น้อยกว่าประเภทข้อมูลที่สามารถเก็บได้
5:ไม่แน่นอน
เมื่อผลลัพธ์ของการดำเนินการแตกต่างจากที่คาดไว้ สิ่งนี้เรียกว่าข้อยกเว้นที่ไม่แน่นอน เมื่อดำเนินการด้วยความแม่นยำที่ไม่ถูกผูกไว้และช่วงเลขชี้กำลัง สิ่งนี้จะเกิดขึ้น
ในบางกรณี สถานการณ์ดังกล่าวสามารถจัดการได้อย่างสง่างาม ตัวอย่างเช่น เมื่อโปรแกรมพยายามหารตัวเลขด้วยศูนย์ โดยทั่วไปแล้วจะดีกว่าถ้าส่งคืนข้อความแสดงข้อผิดพลาดและยุติโปรแกรมอย่างสง่างาม แทนที่จะปล่อยให้โปรแกรมหยุดทำงาน
#รวม
#รวม
ใช้เนมสเปซ std;
float Div(เลขลอย, ถ้ำลอย)
{
ถ้า (den ==0) {
Throw runtime_error("ข้อผิดพลาดทางคณิตศาสตร์:พยายามหารด้วย 0\n");
กลับ (หมายเลข / ถ้ำ);
int main()
{
float num, denom, ผลลัพธ์;
หมายเลข =10;
ดีนอม =0;
ลอง {
result =Div(num, denom);
cout <<"ผลหารคือ" <<ผลลัพธ์ <
จับ (runtime_error&e) {
cout <<"มีข้อยกเว้นเกิดขึ้น" <
ในโค้ดนี้ Div ฟังก์ชันถูกเรียกโดย try block ภายใน main . หาก นิกาย ไม่เท่ากับ ศูนย์ , Div ฟังก์ชั่นส่งคืนผลหาร; หากเป็นเช่นนั้น จะถือเป็นข้อยกเว้นข้อผิดพลาดรันไทม์ ถูกโยนทิ้ง ก่อนที่จะเรียกใช้ฟังก์ชันใดกับวัตถุข้อผิดพลาดรันไทม์ e บล็อก catch จะสกัดกั้นข้อยกเว้นนี้และพิมพ์ข้อความ “เกิดข้อผิดพลาด” . มันถูกใช้เพื่อระบุข้อยกเว้น ข้อยกเว้นมาตรฐานของคลาส ซึ่งอธิบายไว้ใน stdยกเว้น ไฟล์ส่วนหัวมีฟังก์ชันเสมือนที่เรียกว่า อะไร() . ข้อความ “ข้อผิดพลาดทางคณิตศาสตร์:พยายามหารด้วย 0” จึงถูกพิมพ์ออกมา
เอาต์พุต ป>
เพื่อป้องกันข้อยกเว้นจุดลอยตัว ใน C++ จำเป็นต้องตรวจสอบพารามิเตอร์ทั้งหมดที่ส่งไปยังฟังก์ชัน ใช้รูปแบบที่เหมาะสม และทดสอบตัวหารเพื่อหาค่าศูนย์อย่างชัดเจน นอกจากนี้ เมื่อใช้ประเภทข้อมูลคู่ สิ่งสำคัญคือต้องขยายช่วงของประเภทข้อมูลหากโปรแกรมต้องการผลลัพธ์ทางคณิตศาสตร์ที่มากขึ้น
ข้อยกเว้นจุดลอยตัว ในภาษา C++ เกิดจากการดำเนินการกับค่าตัวเลขที่ไม่ถูกต้องและอาจส่งผลต่อความสามารถของโปรแกรมในการทำงานอย่างถูกต้อง เพื่อหลีกเลี่ยงข้อผิดพลาดดังกล่าว สิ่งสำคัญคือต้องตรวจสอบพารามิเตอร์ทั้งหมดที่ส่งไปยังฟังก์ชัน และใช้ประเภทข้อมูลที่เหมาะสม นอกจากนี้ การจับข้อยกเว้นจุดลอยตัวยังเป็นประโยชน์อีกด้วย .
บทสรุป