5

これは非常に単純な質問ですが、プロジェクト全体に多大な影響を与える重要な質問です。

次のコード スニペットがあるとします。

unsigned int x = 0xffffffff;
float f = (float)((double)x * (double)2.328306436538696e-010); //  x/2^32

0.99999 のようなものになると思いfますが、最も近い近似値であるため、代わりに 1 に丸められfloatます。float[0,1] ではなく [0,1) 間隔の値が必要なので、これは良くありません。簡単なことだとは思いますが、少しでもお役に立てれば幸いです。

4

5 に答える 5

1

値を最大精度に切り捨て (上位 24 ビットを保持)、2^24 で除算して、1 に丸められずに float が表すことができる最も近い値を取得できます。

unsigned int i = 0xffffffff;
float value = (float)(i>>8)/(1<<24);

printf("%.20f\n", value);
printf("%a\n", value);

>>> 0.99999994039535522461
>>> 0x1.fffffep-1
于 2013-08-06T16:50:04.027 に答える