質問

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

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

役に立ちましたか?

解決

少なくとも std :: numeric_limits :: is_iec559 (IEEE 754)は真( std :: numeric_limits :: has_infinity も本当です)、あなたはすでに述べられている方法で、正および負の無限値を表現することができます。

IEEE 754-1985の短い説明 wikipedia

......スニップ......

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

陽性と負の無限大

正および負の無限大は、このように表される:

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

......スニップ......

アサーション

次の例は、ターゲットプラットフォームがIEEE 754 floatsをサポートしていない場合に、ターゲットプラットフォームが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;
}
.

他のヒント

もし std::numeric_limits<double>::is_iec559true その後、安全に使用する必要があります -

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

(IEC559はIEEE754のISOの等量です)

それがあれば false それから私はC++標準があなたに助けを与えるとは思わないので、もっと多くの仕事があります。

あなたの使い方をコンパイラするのかわかりませんが、GCCで-std::numeric_limits<double>::infinity()を使用して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;
.

しかし、それがより多い解決策をもたらす可能性が高いので、負の無限大の代わりにアプリケーションで最低を使用することを考慮すると、価値があるかもしれません。

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