web-dev-qa-db-ja.com

負の無限大

負の無限大の値をfloatまたはdouble変数に割り当てる方法を見つけようとしています。標準ライブラリの制限を含めて、無限大表現を取得でき、その(-無限大)の前にマイナスを追加すると、IEEE754浮動小数点で探している値になる可能性があることを知っています(確かに)標準(0x7FFFFFFFは0xFFFFFFFFになる可能性があります)が、他に存在する可能性のある標準(存在する場合)は言うまでもなく、それについてもわかりません。本当にプロフェッショナルではなく、実装に依存していると思います。

もちろん、負の無限のプラットフォームと実装の値を個別に取得する良い方法はありますか、そうでなければ私は#defineを使用するかもしれません、誰もが前処理が好きです。

34
Setzer22

少なくとも std :: numeric_limits :: is_iec559 (IEEE 754)がtrueの場合(つまり、 std :: numeric_limits :: has_infinity もtrueであることが保証されます)、既に述べたように、正および負の無限大の値。

WikipediaのIEEE 754-1985無限値の簡単な説明

......ちょっと......

バイアス指数フィールドは、計算の無限または無効な結果を示すためにすべて1ビットで埋められます。

正および負の無限大

したがって、正と負の無限大は次のように表されます。

 sign = 0 for positive infinity, 1 for negative infinity.
 biased exponent = all 1 bits.
 fraction = all 0 bits.

......ちょっと......

アサーション

次の例は、期待どおりに動作するか、ターゲットプラットフォームがIEEE 754 floatをサポートしていない場合にコンパイル時エラーを発生させます。

#include <cstdlib>
#include <cmath>
#include <cassert>
#include <limits>

int main(void)
{
    //Asserts floating point compatibility at compile time
    static_assert(std::numeric_limits<float>::is_iec559, "IEEE 754 required");

    //C99
    float negative_infinity1 = -INFINITY;
    float negative_infinity2 = -1 * INFINITY;

    float negative_infinity3 = -std::numeric_limits<float>::infinity();
    float negative_infinity4 = -1 * std::numeric_limits<float>::infinity();

    assert(std::isinf(negative_infinity1) && negative_infinity1 < std::numeric_limits<float>::lowest());
    assert(std::isinf(negative_infinity2) && negative_infinity2 < std::numeric_limits<float>::lowest());
    assert(std::isinf(negative_infinity3) && negative_infinity3 < std::numeric_limits<float>::lowest());
    assert(std::isinf(negative_infinity4) && negative_infinity4 < std::numeric_limits<float>::lowest());

    return EXIT_SUCCESS;
}
29
Sam

_std::numeric_limits<double>::is_iec559_がtrueの場合、使用しても安全です-

double negative_infinity = - std::numeric_limits<double>::infinity();

(IEC559は、IEEE754に相当するISOです)

falseの場合、C++標準では何の助けも得られないと思うので、やるべきことはもっとたくさんあります。

7
Ian Cook

どのコンパイラを使用しているかわかりませんが、gccおよびMinGwで-std::numeric_limits<double>::infinity()を使用できます Infinity-and-NaN を参照してください。また、MSVCで次のコードを実行すると、trueが返されました。

double infinity(std::numeric_limits<double>::infinity());
double neg_infinity(-std::numeric_limits<double>::infinity());
double lowest(std::numeric_limits<double>::lowest());

bool lower_than_lowest(neg_infinity < lowest);
std::cout << "lower_than_lowest: " << lower_than_lowest << std::endl;

ただし、より移植性の高いソリューションが得られる可能性が高いため、アプリケーションで負の無限大の代わりに最低を使用することを検討する価値があります。

5
kenba