42

float または double 変数に負の無限大の値を代入する方法を理解しようとしています。標準ライブラリの制限を含めて、無限表現を取得できるようです。その前にマイナス (-infinity) を追加すると、IEEE754 浮動小数点で探している値になる可能性があることを (かなり確実に) 知っています。標準 (0x7FFFFFFF は 0xFFFFFFFF になる可能性があるため) ですが、それについてはよくわかりません。私はそれが本当に専門的ではなく、実装に依存していると思います。

もちろん、負の無限大プラットフォームと実装の値を個別に取得する良い方法はありますか?それ以外の場合は、#define を使用することもできます。

4

3 に答える 3

34

少なくともstd::numeric_limits::is_iec559 (IEEE 754) が true の場合 ( std::numeric_limits::has_infinityも true であることを保証します)、既に述べた方法で正と負の無限値を表現できます。

ウィキペディアからの IEEE 754-1985 無限値の簡単な説明:

......をちょきちょきと切る......

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

正と負の無限大

正と負の無限大は次のように表されます。

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

......をちょきちょきと切る......

アサーション

次の例は、期待どおりに動作するか、ターゲット プラットフォームが IEEE 754 浮動小数点数をサポートしていない場合にコンパイル時エラーを引き起こします。

#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;
}
于 2013-11-16T09:44:54.300 に答える
9

もしそうなら、それは安全に使用できるはずですstd::numeric_limits<double>::is_iec559-true

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

(IEC559 は IEEE754 の ISO 相当です)

もしそうならfalse、C++標準があなたに何の助けも与えないと思うので、やるべきことはもっとたくさんあります。

于 2013-11-16T09:42:59.657 に答える
6

使用しているコンパイラはわかりませんが-std::numeric_limits<double>::infinity()、gcc と MinGw で使用できます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;

ただし、アプリケーションで負の無限大ではなく、lowest を使用することを検討する価値があるかもしれません。これは、より移植性の高いソリューションになる可能性が高いためです。

于 2013-11-16T09:59:11.780 に答える