2

いくつかの変更の後、巨大なアプリケーションで浮動小数点例外が発生しました。変更をコメントしようとしたところ、1 つの単純な関数呼び出しを有効にすると FPE が発生することがわかりました。

api::getMaxSize();

これは単に値を返します。このように見えます

int api::getMaxSize() { return 536870912; };

これは静的メンバー関数です。これをヘッダーファイルに移動すると、すべて正常に動作します。私は混乱しています、何が原因でしょうか?API は別のモジュールにあり、動的ライブラリとしてリンクされているように見えますが、これがどのように問題を引き起こす可能性がありますか?

追加した

api.hテンプレートであり、ヘッダーファイルに実装されている関数 maxBox() があります。この関数が呼び出すgetMaxSize()

template <typename T>
static rectangle<T> maxBox()
{
    return rectangle<T>(
        getMinSize(), getMinSize(),
        getMaxSize(), getMaxSize()
    );
}

ここに呼び出しコードがあります

if (!api::maxBox<double>().contains(box * scale)) { /* api::getMaxSize(); */ }

getMaxSize() 呼び出しを有効にすると、プログラムは FPE をスローし始めますが、実際には getMaxSize() は呼び出されません。

Found FPE inを追加box * scaleしました。呼び出しなしでなぜ機能していたのか理解できませんgetMaxSize()が、問題は解決しました。みんなに感謝します。

前もって感謝します。

4

1 に答える 1

1

浮動小数点の例外(実際にはシグナル)は、さまざまな理由で発生します。主なものは次のとおりです。

  • 整数をゼロで除算します
  • 符号付き整数に対する操作はオーバーフローします(符号なし整数はCおよびC ++でサイレントにラップアラウンドする必要があります)。

ご覧のとおり、浮動小数点数とは何の関係もありません。名前は歴史的なものであり、多くのソースコードを壊さずに変更することはできません(にSIGFPE定数があります<signal.h>)。

GetMaxSizeで表現できない値を返すのはここである可能性がありますint

于 2011-05-20T09:57:30.650 に答える