入力浮動小数点値が 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 の代替ですか?