Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ทำความเข้าใจกับข้อยกเว้นจุดลอยตัวใน C ++:สาเหตุและแนวทางแก้ไข

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

ในภาษา 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++ จำเป็นต้องตรวจสอบพารามิเตอร์ทั้งหมดที่ส่งไปยังฟังก์ชัน ใช้รูปแบบที่เหมาะสม และทดสอบตัวหารเพื่อหาค่าศูนย์อย่างชัดเจน นอกจากนี้ เมื่อใช้ประเภทข้อมูลคู่ สิ่งสำคัญคือต้องขยายช่วงของประเภทข้อมูลหากโปรแกรมต้องการผลลัพธ์ทางคณิตศาสตร์ที่มากขึ้น

บทสรุป

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