6

1.0 未満の最も近い数値を浮動小数点として使用したいと考えています。IEEE-754に関するウィキペディアの記事を読むことで、1.0 のバイナリ表現が であることを確認できた3FF0000000000000ので、最も近い double 値は実際には0x3FEFFFFFFFFFFFFFです。

このバイナリ データで double を初期化する唯一の方法は次のとおりです。

double a;
*((unsigned*)(&a) + 1) = 0x3FEFFFFF;
*((unsigned*)(&a) + 0) = 0xFFFFFFFF;

これは、使用するのがかなり面倒です。

可能であれば、この倍数を定数として定義するより良い方法はありますか?

4

7 に答える 7

8

16 進の float および double リテラルは存在します。構文は 0x1.(仮数)p(10 進数の指数) です。あなたの場合、構文は次のようになります。

double x = 0x1.fffffffffffffp-1
于 2010-10-16T04:49:08.230 に答える
3

安全ではありませんが、次のようなものです。

double a;
*(reinterpret_cast<uint64_t *>(&a)) = 0x3FEFFFFFFFFFFFFFL;

ただし、これはシステム上の浮動小数点数の特定のエンディアンに依存するため、これを行わないでください。

代わりに、DBL_EPSILON<cfloat>または別の回答で指摘されているようにstd::numeric_limits<double>::epsilon())有効に使用してください。

于 2010-10-16T00:59:01.713 に答える
3
#include <iostream>
#include <iomanip>
#include <limits>
using namespace std;

int main()
{
    double const    x   = 1.0 - numeric_limits< double >::epsilon();

    cout
        << setprecision( numeric_limits< double >::digits10 + 1 ) << fixed << x
        << endl;
}
于 2010-10-16T01:04:08.613 に答える
1

を作成して固定幅整数型bit_castを使用すると、安全に実行できます。

template <typename R, typename T>
R bit_cast(const T& pValue)
{
    // static assert R and T are POD types

    // reinterpret_cast is implementation defined,
    // but likely does what you expect
    return reinterpret_cast<const R&>(pValue);
}

const uint64_t target = 0x3FEFFFFFFFFFFFFFL;
double result = bit_cast<double>(target);

あなたはおそらくそれから差し引くepsilonことができますが。

于 2010-10-16T01:05:46.333 に答える
0

少し古風ですが、 を使用できますunionlong longシステム上で aと aが両方とも 8 バイト長であると仮定doubleします。

typedef union { long long a; double b } my_union;

int main()
{
    my_union c;
    c.b = 1.0;
    c.a--;
    std::cout << "Double value is " << c.b << std::endl;
    std::cout << "Long long value is " << c.a << std::endl;
}

ここでは、1.0 のビット表現が何であるかを事前に知る必要はありません。

于 2010-10-16T03:07:32.757 に答える
0

少しジャグリングするよりも、最も直接的な解決策はnextafter()fromを使用することmath.hです。したがって:

#include <math.h>
double a = nextafter(1.0, 0.0); 

1.0これを次のように読みます。の方向の次の浮動小数点値0.0。元の質問からの「1.0未満の最も近い数値」のほぼ直接のエンコード。

于 2019-12-09T17:47:19.990 に答える