我正在C# 中实现基于 System.Int64的Q31.32 定点数值类型。现在我正在尝试正确地进行模运算(%)。
我见过的所有定点算术的实现都简单地根据整数模来定义 Qm.n 模,即两个 Qm.n 数的模是它们底层整数表示的模。这在一般情况下有效,但在两种特定情况下失败:
x % y
抛出一个OverflowException
ifx == Int64.MinValue
和y == -1
. 在这种情况下,我可以使用 if 语句轻松处理此问题并返回 0,尽管这是一种奇怪的行为(unchecked
在这里没有帮助)。x % y
对于 和的一些小值,错误地返回x
0y
。例如,如果和的整数表示是和(x
十进制 :~-0.000000096159 和~0,000000013737),则模为 (十进制:0),而其十进制值的模为(根据 System.Decimal)~-0.000000013737 . 这个误差比类型的最大精度 (2^-32) 大约大 60 倍,因此不能认为是舍入误差。y
-413
59
0
最后一个错误的原因是什么,我可以做些什么来获得更好的准确性?