2

Linux の C++ アプリで double 値の無限大をチェックする必要があります。ほとんどのプラットフォームでは、これは と比較して機能しstd::numeric_limits<double>::infinity()ます。ただし、一部の古いプラットフォーム (gcc 3.2.2 を使用する RedHat 9 など) では、これは利用できず、std::numeric_limits<double>::has_infinityそこでは誤りです。

これらのプラットフォームにはどのような回避策をお勧めしますか?

4

3 に答える 3

3

ほとんどの場合そうであるように、IEEE 754 演算を使用している場合、無限大は適切に定義された値であり、すべての算術演算の結果が定義されています。特に、

infinity - infinity = NaN

正と負の無限大とNaN値は、これが真である唯一の値です。NaN は、関数の定義域エラーを示すために使用される特別な「非数」値ですsqrt(-1)。また:

NaN != NaN

NaNs は、これが真である唯一の値です。

したがって:

bool is_infinite(double x) {
    double y = x - x;
    return x == x && y != y;
}

xが正または負の無限大である場合にのみ true を返します。x > 0正の無限大のみをチェックする場合は、テストを追加します。

于 2009-01-15T17:06:04.570 に答える
1

INFINITYさて、私は今、その特定のマシンでマクロを使用することに頼っていNANます-うまく機能しているようです。彼らはから来ていmath.hます。

于 2009-01-19T10:13:50.690 に答える
1

ほとんどの場合、std::numeric_limits::max() は std::numeric_limits::infinity() の有効な置き換えとなります。

ただし、使用にはもっと注意する必要があります。オーバーフローでは、オーバーフローが検出された場合は、オーバーフローを手動で検出し、結果を明示的に最大値に設定する必要があると思います。

于 2009-01-15T16:44:11.820 に答える