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

C# x86与x64上的Mod(%)运算符,c#,C#,我需要帮助来解决一个奇怪的bug–当我在x86上使用mod(%)操作符时,一切正常, 但在x64上,我有时会得到NaN作为余数(通常在角度=0时发生)。 我设法在我的代码之外重现了这个bug,但只使用了Angle=double.Epsilon(在我的代码中,Angle=0也会出现这种情况) 问候,, Shay这并不是一个奇怪的bug,而是一个很常见的bug。如果您在数值数据类型的外部范围内,并且使用操作,那么如果没有发生这种情况,我会感到惊讶 解决方案可能是封装mod函数 static doub

我需要帮助来解决一个奇怪的bug–当我在x86上使用mod(%)操作符时,一切正常, 但在x64上,我有时会得到NaN作为余数(通常在角度=0时发生)。 我设法在我的代码之外重现了这个bug,但只使用了Angle=double.Epsilon(在我的代码中,Angle=0也会出现这种情况)

问候,,
Shay

这并不是一个奇怪的bug,而是一个很常见的bug。如果您在数值数据类型的外部范围内,并且使用操作,那么如果没有发生这种情况,我会感到惊讶

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

static double myMod(double v, double m){
    if(v < m) return v; 
    return v % m;
}
静态双myMod(双v,双m){
如果(v
我可以问一下,为什么你会担心这样一个临界情况吗?

在C#中,模运算符可以取比通常C的int值更多的值。但是是的,我想当你们做ε量的时候,ISA之间是有区别的

在你的例子中,ε是一个足够小的数,足以引起NAN

看看是否可以用float和其他类型复制它。如果你能使用它们,问题就“解决了”


作为一种解决方法,您可以使用near epsilon自己进行计算,并在这种情况下返回0。

免责声明:我不是.Net程序员

但这听起来像个虫子。该操作对于您提供的输入定义良好,应该返回
m_角度
。我的猜测是,实现无条件地尝试除法
m_Angle/m_2PI
,这会使您的输入下溢。显然,32位和64位平台对这种情况的处理有所不同。这本可以用类似马库斯·约翰逊(Marcus Johansson)的答案正确地完成,但代价是稍微有点小
额外范围检查的运行时惩罚。

不太确定这是错误——x86和x64浮点可以返回不同的结果。小提示:你可以使用
Math.PI
而不是将其指定为你自己的变量。早期,临界情况非常重要。它们造成了生产软件中大量的bug。如果
v
m
可能为负值,则给定的函数是不正确的。
static double myMod(double v, double m){
    if(v < m) return v; 
    return v % m;
}