numeric_limits< double> :: has_infinityがfalseの場合、推奨される回避策は何ですか?

StackOverflow https://stackoverflow.com/questions/447520

質問

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

これらのプラットフォームに推奨する回避策は何ですか?

役に立ちましたか?

解決 3

さて、私はその特定のマシンで INFINITY および NAN マクロを使用するようになりました-うまくいくようです。それらは math.h から来ています。

他のヒント

IEEE 754算術を使用している場合、ほぼ間違いなく、無限は明確に定義された値であり、すべての算術演算の結果が定義されています。特に、

infinity - infinity = NaN

正および負の無限大および NaN 値は、これが真である唯一の値です。 NaNは特別な「not-a-number」です。関数のドメインエラーを示すために使用される値。 sqrt(-1)。また:

NaN != NaN

NaN は、これが当てはまる唯一の値です。

したがって:

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

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

ほとんどの場合、std :: numeric_limits :: max()は、std :: numeric_limits :: infinity()の有効な代替となります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top