x86与x64上的Mod(%)运算符

Sha*_*hay 7 c#

我需要帮助来解决一个奇怪的错误 - 当我在x86上使用mod(%)运算符时都很好,但是在x64上我有时会得到NaN作为余数(通常在Angle = 0时发生).我设法在我的代码之外重现那个bug,但只有Angle = double.Epsilon(在我的代码中它也发生在Angle = 0).

class Program
{
    public const double M_PI = 3.14159265358979323846;
    static void Main(string[] args)
    {
        double m_2PI = (2 * M_PI);
        double m_Angle = double.Epsilon;
        double mod = (m_Angle % m_2PI);
        //x86 mod = 4.94065645841247E-324
        //x64 mod = NaN
        if (double.IsNaN(mod))
            Debug.Write(mod);
    }
}
Run Code Online (Sandbox Code Playgroud)

问候,谢伊

Mar*_*son 1

这不是一个奇怪的错误,而是一个预料之中的错误。如果您处于数值数据类型的外部范围并进行运算,如果这种情况没有发生,我会感到惊讶。

解决方案可能是封装 mod 函数。

static double myMod(double v, double m){
    if(v < m) return v; 
    return v % m;
}
Run Code Online (Sandbox Code Playgroud)

我能问一下,你为什么担心这种边缘情况?

  • 显然,边缘案例非常重要。它们导致了生产软件中的大量错误。 (7认同)