5

実験的な計算によって得られた、各値が数値キーを持つ辞書を作成しようとしています。

double一意性または同等性に関して 2 つの浮動小数点数を比較するのは難しいため、他の浮動小数点型はキーとして使用するのに適していません。

Decimalこの点で良い候補者であるかどうか誰かが知っていますか? 別の方法は、指定された精度で倍精度を文字列に変換することですが、それは私には洗練されていない回避策のように思えます。

4

3 に答える 3

6

floatまたはdecimalを辞書のキーとして使用することに大きな違いはありません。どちらも指数で数値を表すため、スケールが異なるだけで同じ比較の問題が発生します。

「ほぼ同じ値」のキーが必要な場合は、同様の結果を同じバケットに入れるために既知の方法で値を丸めるカスタムキーにする必要があります。 ..

于 2013-02-04T19:08:28.690 に答える
1

decimalorを使用している場合は、十分な大きさがないdoubleため、代わりに使用することを検討してください。intlong

また、分数/小数部分がなく、整数のみが含まれている限り、decimalsまたはsを比較しても問題ないと思います(-1、0、1、2、3など)double

(ただし、将来の予期しないエラーを回避するために、比較が重要な場合にdecimal/を使用することはお勧めしません)double

6桁の精度のみを扱う場合は、にキャストしてintも問題ありません。

于 2013-02-04T19:13:24.530 に答える
1

これは古い質問であることは知っていますが、私の答えが誰かを助けることができると信じています。

フロートキーが本当に必要でした。

もちろん、精度の問題に遭遇し、私の辞書は必要以上に大きくなりました (たとえば、同じものとして扱われるようにしたかった1.00.999998です)。相対誤差ははるかに普遍的ですが、比較に絶対誤差を使用するため、10進数の固定数を使用することは優れた解決策ではありません(たとえば、OPによって提案されているように文字列に変換する)。

私は次のメソッドを書くことになりました:

float Quantize(float x)
{
    const float relMaxQuantError = 0.001f;

    float ret = Mathf.Log10(Mathf.Abs(x));
    float quantum = Mathf.Log10(1+relMaxQuantError); 
    ret = Mathf.Floor(ret/quantum) * quantum;
    ret = Mathf.Sign(x) * (Mathf.Pow(10, ret));

    return ret;
}

辞書に格納する前に、このメソッドを使用して float を量子化します。最大許容相対誤差は const で制御できます (現在は 0.1 % です)。

PS: MathfUnity のクラスです。標準を使用するように簡単に調整できますMath

于 2016-03-18T17:20:41.417 に答える