0

さて、クラシック1 * 1/3 * 3=0.9999999があります。なぜそうなるのか理解しています。

私のユースケースでは、整数にしようとしています。無限精度の数学で、最初に整数を生成する必要があると指示された場合を除いて、私は自分の価値の下限を喜んで受け入れます(上記のユースケースを参照)。

これを達成するために一般的に使用される方法はありますか?

例:

double myFloat = 1.0 / 2.0;

1 * myFloat * 2 = 2結果:2

myFloat = 1.0 / 2.0;

2.5 * myFloat * 2 = 2.5結果:2

myFloat = 1.0 / 3.0;

1 * myFloat * 3 = .9999結果:1

myFloat = 1.0 / 3.0;

.9 * myFloat * 3 = .9結果:0

私が考えた1つの方法は、結果をフローリングする前に、常に結果にデルタを適用することでした。しかし、私は自分の結果をクリーンで一般的に受け入れられている方法で達成したいと思っています。

編集:フィードバックに基づいて明確にするために変更されました。

4

1 に答える 1

0

f(x)を最も近い整数に丸めます。round(f(x))

f(x)とround(f(x))を比較します。差が丸めによるものになるほど十分に近い場合は、結果としてround(f(x))を使用します。そうでない場合は、floor(x)を使用します。

入力がすべて同じ大きさである場合、いくつかの固定数イプシロンにはabs(f(x)-round(f(x))<イプシロンを使用するだけで十分な場合があります。そうでない場合は、abs((f(x)-round)を使用します。 (f(x))/ f(x))<ゼロ以外のf(x)のイプシロン。

于 2013-02-28T03:02:25.673 に答える