Ngoại lệ dấu phẩy động xảy ra khi một phần mềm cố gắng thực hiện một thao tác không đúng trên một số. Loại ngoại lệ này xảy ra khi người dùng cố gắng thực hiện các thao tác không hợp lệ, chẳng hạn như chia cho 0, chia số âm cho số chẵn, lấy căn bậc hai của số âm hoặc tràn phép tính vượt quá giới hạn của loại dữ liệu kép.
Trong C++, “SIGFPE” trình xử lý tín hiệu xử lý các ngoại lệ dấu phẩy động (FPE). Khi người dùng cố gắng thực hiện các tác vụ được đề cập, trình xử lý tín hiệu này sẽ được gọi. Khi bộ xử lý tín hiệu đã can thiệp, nó sẽ in thông báo lỗi ra đầu ra tiêu chuẩn và tạm dừng chương trình.
Tại sao ngoại lệ dấu phẩy động lại xảy ra?
Ngoại lệ dấu phẩy động có thể xảy ra do lỗi lập trình hoặc khi chương trình cố gắng xử lý một giá trị nằm ngoài đặc tả. Ví dụ:nếu một chương trình cố gắng chia một số nguyên cho 0 hoặc nếu một chương trình cố gắng lấy căn bậc hai của một số âm thì ngoại lệ dấu phẩy động sẽ xảy ra. Hơn nữa, một số ngoại lệ dấu phẩy động có thể xảy ra do phát hiện sai bộ xử lý.
Nhiều yếu tố, chẳng hạn như hoạt động không phù hợp, tràn, tràn, chia cho 0 và độ chính xác, có thể dẫn đến ngoại lệ dấu phẩy động . Chúng tôi sẽ đề cập đến từng lập luận này trong phần này.
1:Hoạt động bất hợp pháp
Khi người dùng quên diễn đạt một thao tác hoặc thao tác đó không có giá trị toán học, chương trình sẽ không thực thi được do thao tác không hợp lệ. Điều này bao gồm các phép tính như căn bậc hai và logarit của số âm chẳng hạn. Mặc dù có thể lấy căn bậc hai của số âm khi xử lý số phức nhưng không có cơ chế dựa trên máy tính nào để thể hiện điều này.
Ngoài ra, thao tác không chính xác sẽ xảy ra nếu phần mềm thực thi dấu phẩy động hoạt động trên một vị trí chỉ có số nguyên. Điều này là do sự không khớp giữa thao tác bạn đang cố thực hiện trên dữ liệu (thao tác dấu phẩy động) và dữ liệu được lưu trữ (số nguyên).
2:Chia không
Ngoại lệ dấu phẩy động bị ném ra nếu bạn cố chia một số nguyên cho 0. Điều tương tự cũng xảy ra khi bạn cố chia cho NaN hoặc vô cực. Dưới đây là một số ví dụ:1/0, log(0).
3:Tràn
Khi một thao tác trả về một giá trị nằm ngoài phạm vi mong đợi của nó, ngoại lệ tràn sẽ xảy ra. Giá trị này lớn hơn hoặc thấp hơn giá trị có thể biểu thị nhỏ nhất, theo tuyên bố này.
4:Tràn dưới
Tràn dưới xảy ra khi phép tính mang lại kết quả nhỏ hơn kết quả mà loại dữ liệu có thể chứa.
5:Không chính xác
Khi kết quả của một hoạt động khác với những gì được dự đoán, đây được gọi là ngoại lệ không chính xác. Khi thao tác được thực hiện với độ chính xác không giới hạn và phạm vi số mũ, điều này sẽ xảy ra.
Trong một số trường hợp, những tình huống như vậy có thể được xử lý một cách khéo léo. Ví dụ:khi một chương trình cố gắng chia một số cho 0, thông thường tốt hơn là trả về một thông báo lỗi và chấm dứt chương trình một cách nhẹ nhàng thay vì để chương trình gặp sự cố.
#include
#include
sử dụng không gian tên std;
float Div(float num, float den)
{
nếu (den ==0) {
ném thời gian chạy_error("Lỗi toán học:Đã cố chia cho 0\n");
return (num/den);
int main()
{
số float, mệnh giá, kết quả;
số =10;
mệnh giá =0;
thử {
kết quả =Div(num, denom);
cout <<"Thương là " <
bắt (runtime_error&e) {
cout <<"Xảy ra ngoại lệ" <
Trong mã này, Div hàm được gọi bởi khối try bên trong main . Nếu mệnh giá không bằng không , Div hàm trả về thương số; nếu đúng như vậy thì ngoại lệ lỗi thời gian chạy bị ném. Trước khi gọi hàm what với đối tượng lỗi thời gian chạy e, khối bắt chặn ngoại lệ này và in văn bản “Đã xảy ra lỗi” . Nó được sử dụng để xác định ngoại lệ. Ngoại lệ tiêu chuẩn của lớp, được mô tả trong stdException tệp tiêu đề, có chức năng ảo gọi là what() . Thông báo “Lỗi toán:Đã cố chia cho 0” Kết quả là được in.
Đầu ra
Để ngăn chặn ngoại lệ dấu phẩy động trong C++, điều cần thiết là phải kiểm tra tất cả các tham số được truyền cho các hàm, sử dụng các định dạng thích hợp và kiểm tra rõ ràng các ước số có giá trị bằng 0. Ngoài ra, khi sử dụng kiểu dữ liệu kép, điều quan trọng là phải mở rộng phạm vi của kiểu dữ liệu nếu chương trình yêu cầu kết quả số học lớn hơn.
Ngoại lệ dấu phẩy động trong C++ là do các thao tác không hợp lệ trên các giá trị số và có thể ảnh hưởng đến khả năng thực thi chính xác của chương trình. Để tránh những lỗi như vậy, điều quan trọng là phải kiểm tra tất cả các tham số được truyền cho hàm và sử dụng các kiểu dữ liệu thích hợp. Hơn nữa, việc nắm bắt được các ngoại lệ dấu phẩy động cũng có lợi .
Kết luận