2011-09-01 20 views
16

Tôi có một chương trình nhỏ thực hiện phân chia dấu phẩy động bằng không, vì vậy tôi mong đợi SIGFPE.Phân chia bằng không không ném SIGFPE

#include <sys/types.h> 
#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 

void signal_handler (int signo) { 
    if(signo == SIGFPE) { 
     std::cout << "Caught FPE\n"; 
    } 
} 

int main (void) { 
    signal(SIGFPE,(*signal_handler)); 

    double b = 1.0; 
    double c = 0.0; 
    double d = b/c; 
    std::cout << "d = "<< d << std::endl; 
    return 0; 
} 

Thực ra, tôi có kết quả như sau:

d = inf 

phiên bản gcc 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)

Những gì tôi nên làm gì để ném SIGFPE trong này trường hợp? Hành vi hoạt động của FP nào phụ thuộc vào (cờ biên dịch/loại CPU và vv)?

Cảm ơn

+2

Điều này sẽ là khá chuẩn nếu bạn có IEEE nổi. – Ingo

+0

Câu hỏi tương tự: [Tôi có thể làm cho gcc cho tôi biết khi kết quả tính toán trong NaN hoặc inf trong thời gian chạy không?] (Http://stackoverflow.com/questions/2941611/can-i-make-gcc-tell-me-when- a-calculator-results-in-nan-or-inf-at-runtime) – sleske

Trả lời

6

Đối với số dấu phẩy động, bạn có thể thay đổi hành vi này bằng cách thiết lập từ kiểm soát FPU. Hãy xem here

+0

Tôi biết về từ kiểm soát FPU. Nó có thể được thiết lập với _controlfp() dưới nền tảng MS. Nó có tồn tại tương đương POSIX cho chức năng này không? –

+1

@Yuri: Xem tiêu chuẩn của bạn có bao gồm tệp ' 'xác định' fesettrapenable' hay không. Đây không phải là tiêu chuẩn nhưng có sẵn rộng rãi.Trên linux, sử dụng 'feenableexcept' - nhưng bạn cần' #define _GNU_SOURCE' trước khi bạn '#include '. –

+1

@Yuri S. Cherkasov Đó là trong fpu_control.h. Kiểm tra ở đây: http://www.christian-seiler.de/projekte/fpmath/ – Oleg

9

Bạn chỉ nhận được tín hiệu nếu bạn thực hiện phân chia số nguyên bằng 0. Đối với phân chia số dấu phẩy động bằng 0 thì được xác định rõ.

Điều này thực sự được giải thích khá tốt trong Wikipedia article.

+0

Tôi không lo lắng về câu trả lời của bạn, chỉ cần carping tại rằng inanity trong tiêu chuẩn IEEE. Hãy suy nghĩ có bao nhiêu ý nghĩa này làm cho: Bạn nhận được một * ngoại lệ dấu chấm động * nếu bạn thực hiện một phân chia * số nguyên * bằng không. Theo mặc định, bạn không nhận được một ngoại lệ dấu chấm động nếu bạn thực hiện một dấu chấm động chia cho số không. Những người làm tính toán số cho một cuộc sống có xu hướng ghét rằng đây là hành vi mặc định. Tệ hơn nữa, chúng tôi không có tiêu chuẩn để có được hành vi mong muốn. Phân chia bằng không, vv, hầu như luôn luôn là một dấu hiệu gì đó đã trở nên tồi tệ. –

+5

Đọc các nhịp nguồn wikipedia: http://754r.ucbtest.org/standards/754.pdf: 7.2: "Nếu số chia là số không và số cổ tức là số không phải là số hữu hạn, thì phép chia cho 0 ngoại lệ sẽ được báo hiệu Kết quả, khi không có bẫy xảy ra, sẽ là một INFINITY đã ký (6.3). " Và chương 8 cho chúng ta biết rằng người dùng có thể chỉ định một trình xử lý bẫy, được nâng lên khi bất kỳ ngoại lệ nào trong ch.7 xảy ra. –

+0

Điều đó thật thú vị, nhưng mục đích là để nắm bắt các tình huống như vậy, bởi vì chia cho số không là hoạt động bất hợp pháp trong ngữ cảnh của tôi. –

4

Bạn không nhận được tín hiệu vì hành vi mặc định trên hầu hết các máy là làm ô nhiễm dữ liệu của bạn bằng NaN (không phải một số) và thông tin vô tuyến. Bạn phải bật ngoại lệ dấu phẩy động và cách bạn thực hiện điều đó là máy cụ thể. Nhìn vào tiêu đề hệ thống fenv.h, nếu bạn có. Chức năng fesettrapenable cho phép bắt ngoại lệ điểm nổi trên nhiều máy.

Thật không may, không có chức năng chuẩn nào để xử lý các ngoại lệ dấu phẩy động.

Các vấn đề liên quan