2011-09-01 16 views
16

浮動小数点除算をゼロで実行する小さなプログラムがありますので、SIGFPEが必要です。0で除算しても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; 
} 

は実際に、私は次の出力を得た:

d = inf 

gccのバージョン4.5.2(Ubuntuの/リナロ4.5.2-8ubuntu4)

私はこれでSIGFPEを投げるために何をすべき場合? FPの動作が依存する要因(コンパイラフラグ/ CPUの種類など)

おかげ

+2

IEEE浮動小数点数を持つ場合は、これはかなり標準です。 – Ingo

+0

同様の質問:[実行時に計算結果がNaNまたはinfになったときにgccに通知できますか?](http://stackoverflow.com/questions/2941611/can-i-make-gcc-tell-me-when-計算結果のイン・ラン・イン・ランタイム) – sleske

答えて

6

浮動小数点数については、FPU制御ワードを設定することでこの動作を変更できます。見てください

+0

私はFPU制御ワードについて知っています。 MSプラットフォームの_controlfp()で設定されている可能性があります。この関数のPOSIXに相当するものは存在しますか? –

+1

@Yuri:標準インクルードファイル ''が 'fesettrapenable'を定義しているかどうかを確認してください。これは標準ではありませんが、広く入手できます。linuxでは 'feenableexcept'を使いますが、' #include 'の前に' #define _GNU_SOURCE'する必要があります。 –

+1

@Yuri S. Cherkasovこれはfpu_control.hにあります。ここをクリックしてください:http://www.christian-seiler.de/projekte/fpmath/ – Oleg

9

あなたはゼロによる整数除算を実行する場合にのみ信号を得ます。浮動小数点数の場合、0による除算はよく定義されています。

これは実際にはWikipedia articleでかなりよく説明されています。

+0

私はあなたの答えに悩まされているわけではありません。どれくらい意味があるか考えてみましょう。*整数除算をゼロで実行すると、浮動小数点例外*が発生します。デフォルトでは、浮動小数点除算をゼロで実行すると、浮動小数点例外は発生しません。生活の数値計算を行う人々は、これがデフォルトの動作であることを嫌う傾向があります。さらに悪いことに、望ましい動作を得るための標準はありません。ゼロなどの除算は、ほとんどいつも何かが間違っているサインです。 –

+5

ソースを読むことはウィキペディアに勝つ:http://754r.ucbtest.org/standards/754.pdf: 7.2: "除数がゼロであり、被除数が有限の非ゼロ数であるならば、除算ゼロ例外が通知されるその結果、トラップが発生しなかった場合は、正しく署名されたINFINITY(6.3)となります。 "そして第8章では、ch.7の例外が発生したときに発生するトラップハンドラをユーザーが指定できる必要があることを示しています。 –

+0

これは面白いですが、その目的はそのような状況を捕まえることです。なぜなら、ゼロによる除算は私の状況では不正な操作であるからです。 –

4

ほとんどのマシンのデフォルトの動作はNaN(数字ではない)と無限大でデータを汚染するためです。浮動小数点例外を有効にする必要があります。また、浮動小数点例外はマシン固有のものです。システムヘッダfenv.h(ある場合)を見てください。 fesettrapenable関数は、多くのマシンで浮動小数点例外を捕捉することを可能にします。

残念ながら、浮動小数点例外処理をオンにする標準機能はありません。

関連する問題