C# で System.Int64 に基づくQ31.32 固定小数点数値型を実装しています。現在、モジュロ演算を正しく取得しようとしています (%)。
私が見た固定小数点演算の実装はすべて、Qm.n モジュロを単純に整数モジュロで定義しています。つまり、2 つの Qm.n 数値のモジュロは、それらの基礎となる整数表現のモジュロです。これは一般的なケースでは機能しますが、次の 2 つの特定のケースでは失敗します。
x % y
OverflowException
ifx == Int64.MinValue
と をスローしy == -1
ます。これは if ステートメントで簡単に処理でき、この場合は 0 を返しますが、これは奇妙な動作です (そして、unchecked
ここでは役に立ちません)。x % y
x
との一部の小さな値に対して誤って 0 を返しますy
。たとえば、 と の整数表現がx
(y
10 進数: ~-0.000000096159 および ~0,000000013737) の場合、モジュロは-413
( 10 進数: 0) であり、10 進数値のモジュロは (System.Decimal によると) ~-0.000000013737 です。 . このエラーは、型の最大精度 (2^-32) の約 60 倍であるため、丸めエラーとは見なされません。59
0
この最後のエラーの原因は何ですか?また、精度を上げるためにできることはありますか?