8
myInt = int( 5 * myRandom() )

myRandom()はランダムに生成されたfloatであり、0.2である必要があります。

したがって、このステートメントは1と評価されます

私の質問:浮動小数点エラーのために1と評価されない可能性はありますか?

たとえば、浮動小数点エラーが原因で0.2であるはずの何かが、それよりも少ない可能性がある場合はどうでしょうか。たとえば、IEは次の3つの可能性を考慮します。

int(5 * 0.2 )                = 1 //case 1 normal
int(5 * 0.2000000000000001 ) = 1 //case 2 slightly larger, its OK
int(5 * 0.1999999999999999 ) = 0 //case 3 negative, is NOT OK, as int() floors it

case3も可能ですか?、0.1999999999999999浮動小数点エラーの結果ですか?私はこれまで実際に負のイプシロンを見たことがありません。ケース2が少し大きい場合のみであり、int()にキャストされた場合のように、正しい結果に「フロア」されます。ただし、負のイプシロンでは、「床効果」により、結果の0.9999999999999996が0と評価されます。

4

5 に答える 5

3

ターゲットシステムが圧倒的にデフォルトであるIEEE754バイナリ浮動小数点標準を使用していると仮定すると、.2はfloatまたはdoubleとして表現できないため、myRandomが.2を返すことは不可能です。

myRandom()が.2に最も近い表現可能な数値を返す場合、浮動小数点数として表現可能な.2に最も近い数値は.2よりわずかに大きいため(0.20000000298023223876953125)、最も近い表現可能なdouble(0.20000000000000001110223024625156540423631668090820312)であるため、myIntは1になります。 。

それ以外の場合、これは当てはまりません。たとえば、.6に最も近いdoubleは0.59999999999999997779553950749686919152736663818359375であるため、myIntは3ではなく2になります。

于 2012-07-05T19:25:51.570 に答える
1

はい、少なくともC規格に関する限り、それは可能です。

0.2を2進浮動小数点形式で正確に表すことはできません。したがって、によって返される値はmyRandom()、数学的な値よりわずかに下か、わずかに上になります0.2。C規格では、どちらの結果も許可されています。

IEEEセマンティクスでは、結果がわずかに大きくなることしか許可されていない可能性があります0.2が、C標準ではIEEEセマンティクスは必要ありません。そして、それは結果が値から可能な限り正確に導き出されることを前提としています0.2。値が一連の浮動小数点演算から生成され、それぞれが小さなエラーを引き起こす可能性がある場合、値は簡単に。よりも小さいか大きい可能性があります0.2

于 2012-07-05T19:19:27.410 に答える
1

これは浮動小数点エラーではなく、浮動小数点の動作方法です。1 /(2の累乗)でない分数は正確に表すことができず、最も近い表現可能な数値に切り上げまたは切り捨てられます。

整数に変換する前に、1より大きい小さなイプシロンを掛けることで、コードを修正できます。

myInt = int( 5 * myRandom() * 1.000000000000001 )

すべてのコンピューター科学者が浮動小数点演算について知っておくべきことを参照してください。

于 2012-07-05T19:23:39.110 に答える
0

選択した数によっては可能です。特定の数値を確認するには、いつでも非常に正確に印刷できます。printf( "%1.50f"、0.2)

于 2012-07-05T19:52:31.690 に答える
0

フロートに5.0を掛けてから、ラウンド関数を使用して適切に丸めてみませんか?

于 2012-07-05T19:58:42.340 に答える