1

入力浮動小数点値が 0.0f <= value < 1.0f (1 未満であることに注意) です。

この値をより大きな範囲に乗算すると、当然、浮動小数点の精度が低下します。つまり、値が同等の範囲外になる可能性があります。

たとえば、次のような値から始めるとします。

0.99999983534521f

それを 100 倍すると、次のようになります。

100.000000000000f

どちらでも問題ありませんが、浮動小数点表現を100未満の最も近い浮動小数点値に減らすにはどうすればよいですか?

この小さな手動のトリックを見つけました:

union test
{
    int integer;
    float floating;
};

test value;

value.floating = 1.0f;

printf("%x\n", value.integer);

次に、その 16 進数値を取得して 16 進数を 1 桁減らし、次のように明示的に設定します。

unsigned int almost_one = 0x3f7fffff;

float value = 1.0f;

if (value >= 1.0f)      std::memcpy(&value, &almost_one, sizeof(float));

この特定の値ではうまく機能しますが、代わりに使用できるより一般的なアプローチはありますか?

これを達成するために使用できる、私が気付いていない魔法の命令があることを願っています!

編集:ここでの素晴らしい回答のセット、 std::nextafter は私が求めているもののように見えます。残念ながら、私はまだ C++11 数学ライブラリを使用できないため、これはうまくいきません。複雑なことを避けるために、この質問に C++11 のタグを付け、以下の Mike の回答を受け入れます。

C++03 の新しい質問を開始しました: C++11 の std::nextafter および std::nexttoward for C++03 の代替ですか?

4

2 に答える 2

6

これを達成するために使用できる、私が気付いていない魔法の命令があることを願っています!

C++11 (または C99) 標準ライブラリを使用している場合、 std::nextafter(value, 0.0f)from <cmath>(またはnextafterfrom <math.h>) は より小さい最大の表現可能な値を提供しますvalue

最初の引数の後に、2 番目の引数の方向に「次の」個別の値を指定します。ここでは、ゼロに近い次の個別の値です。

于 2013-05-01T16:51:08.300 に答える