これらの2つのモジュラス計算が2つの異なる結果をもたらす理由を誰かに教えてもらえますか?私は誰かか何かのせいにする必要がありますが、私はこのバグを見つけるのを失いました。
public void test1()
{
int stepAmount = 100;
float t = 0.02f;
float remainder = t % (1f / stepAmount);
Debug.Log("Remainder: " + remainder);
// Remainder: 0.01
float fractions = 1f / stepAmount;
remainder = t % fractions;
Debug.Log("Remainder: " + remainder);
// Remainder: 0
}
VS-2017V15.3.5の使用
私の最善の策は、これは、ランタイムが関連する型よりも高い精度で浮動小数点演算を実行し、割り当て時に結果を型の精度に切り捨てる自由によるものです。
セクション12.1.3のCLI仕様では、格納場所で使用する場合の浮動小数点数、floatおよびdoubleの正確な精度が規定されています。ただし、実行スタック、引数の戻り値などの他の場所で浮動小数点数が使用されている場合は、精度を超えることができます。使用される精度は、ランタイムと基盤となるハードウェアに任されています。この余分な精度により、異なるマシンまたはランタイム間で浮動小数点評価に微妙な違いが生じる可能性があります。
ソースはこちら。
最初の例でt % (1f / stepAmount)
は、より高い精度で完全に実行しfloat
、結果がに割り当てられるときに切り捨てることができますremainder
が、2番目の例で1f / stepAmount
はfractions
、モジュラス演算の前に切り捨てられてに割り当てられます。
stepamount
aconst
を作成すると両方のモジュラス演算が一貫する理由については、コンパイル時に1f / stepamount
評価されて浮動小数点精度に切り捨てられる定数式がすぐになり、本質的に両方の例を同等にする書き込みと同じであるためです。0.01f
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加