numeric_limits< double> :: has_infinityがfalseの場合、推奨される回避策は何ですか?
質問
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()の有効な代替となります。
ただし、使用には注意が必要です。オーバーフローの場合、オーバーフローを手動で検出し、オーバーフローが検出された場合は明示的に結果を最大値に設定する必要があると思います。