2

C#でfrac関数を実装したいのですが(ここではhslの関数のようにhttp://msdn.microsoft.com/en-us/library/bb509603%28VS.85%29.aspx)、非常にプロセッサを集中的に使用するアプリケーション私は可能な限り最高のバージョンが欲しいです。私は次のようなものを使用していました

public float Frac(float value)
{
   return value - (float)Math.Truncate(value);
}

しかし、精度の問題があります。たとえば、2.6fの場合、単体テストで返されます。

期待値:0.600000024fしかしだった:0.599999905f

値を10進数に変換し、最後にfloatに変換して、次のような正しい結果を取得できることを知っています。

public float Frac(float value)
{
   return (float)((decimal)value - Decimal.Truncate((decimal)value));
}

しかし、小数に頼らずにもっと良い方法があるのだろうか...

4

2 に答える 2

2

float(System.Singleのエイリアス)は7桁までしか正確ではありません。とにかく、等式を使用して浮動小数点値を実際に比較するべきではありません。代わりに、それらが許容範囲内にあることを確認する必要があります。たとえば、期待値と実際の値の差が0.000001以下であることを確認します。

Assert.AreEqual(expected, actual, delta);

代わりにdoubleを使用すると、15〜16桁の精度になります。

于 2010-06-16T07:55:06.787 に答える
0

次のように小数を使用する必要があります。

public decimal Frac(decimal value) { return value - Math.Truncate(value); }

したがって、2.6mを通過すると、常に.6が得られます。

于 2010-06-16T07:57:24.513 に答える