を切り捨てたときにこれはおそらくのx86 FPUの専門家のための質問です:浮動小数点丸め
私は範囲[MIN、MAX]のランダムな浮動小数点値を生成する関数を記述しようとしています。問題は、私のジェネレータアルゴリズム(浮動小数点Mersenne Twister、あなたが好奇心ならば)は範囲[1,2]の値しか返さないということです。つまり、私は包括的な上限を求めますが、私の "ソース"生成値は排他的な上限から。ここのキャッチは、基になるジェネレータが8バイトのdoubleを返すことですが、私は4バイトのfloatしか必要とせず、デフォルトのFPU丸めモードをNearestとして使用しています。
私が知りたいのは、この場合の切り捨て自体が、FPU内部の80ビット値が十分に近いときの戻り値が最大値を含むかどうか、または最大値の仮数部を増やすべきかどうかですそれを[1,2]の中間ランダムで乗算する前に、またはFPUモードを変更する必要があるかどうかを判断します。もちろん、他のアイデアもあります。
は、ここで私が現在使用しているコードだ、と私は1.0Fが0x3f800000に解決確認しました:
float MersenneFloat(float min, float max)
{
//genrand returns a double in [1,2)
const float random = (float)genrand_close1_open2();
//return in desired range
return min + (random - 1.0f) * (max - min);
}
それが違いをした場合、これはWin32のMSVC++とLinuxのgccの両方で動作する必要があります。また、SSEの最適化のどのバージョンを使用してもこれに対する答えが変わるでしょうか?
編集:答えは「はい」です。この場合、切り捨てが2倍から浮動小数点になり、結果に最大値を含めるには十分です。詳しくは、Crashworksの回答を参照してください。
なぜ私は走った他の人の間でこのテストを実行すると思いませんでしたか?私は切り捨てで、1.99999は/ arch:SSE2の有無にかかわらず2に丸めます。ありがとう! –
喜んで助けてください - 私はテストの結果が自分自身であるかどうか不思議でした。 – Crashworks