17

ゼロによる浮動小数点除算を実行する小さなプログラムがあるので、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/Linaro 4.5.2-8ubuntu4)

この場合、SIGFPE をスローするにはどうすればよいですか? FP 操作の動作はどの要因 (コンパイラ フラグ/CPU タイプなど) に依存しますか?

ありがとう

4

3 に答える 3

11

ゼロによる整数除算を実行した場合にのみ信号が得られます。浮動小数点数の場合、ゼロによる除算は明確に定義されています。

これは、ウィキペディアの記事で実際にかなりよく説明されています。

于 2011-09-01T08:49:43.060 に答える
6

ほとんどのマシンのデフォルトの動作は、データを NaN (非数) と無限大で汚染するため、シグナルを受信しません。浮動小数点例外を有効にする必要があり、その方法はマシン固有です。システムヘッダーfenv.hがある場合は、それを見てください。この関数fesettrapenableにより、多くのマシンで浮動小数点例外をキャッチできます。

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

于 2011-09-01T09:15:33.560 に答える