作为一名数学家,我对C衍生语言之一的一个小恶习是
(-1) % 8 // comes out as -1, and not 7
fmodf(-1,8) // fails similarly
最佳解决方案是什么?
C++允许使用模板和操作符重载,但这两者对我来说都是比较深奥的领域。欢迎提供示例。
作为一名数学家,我对C衍生语言之一的一个小恶习是
(-1) % 8 // comes out as -1, and not 7
fmodf(-1,8) // fails similarly
最佳解决方案是什么?
C++允许使用模板和操作符重载,但这两者对我来说都是比较深奥的领域。欢迎提供示例。
... 或者只是习惯获得等价类的任何代表。
r
。%
运算符与等价类无关。它是余数运算符,而余数在代数上被定义为非负且小于除数。不幸的是,C语言将其定义错误了。尽管如此,对于提供最佳答案,我还是给予+1的评价。 - R.. GitHub STOP HELPING ICEC++的示例模板
template< class T >
T mod( T a, T b )
{
T const r = a%b;
return ((r!=0)&&((r^b)<0) ? r + b : r);
}
当mod
为正数时,此解决方案避免了负除法或余数运算:
int core_modulus(int val, int mod)
{
if(val>=0)
return val % mod;
else
return val + mod * ((mod - val - 1)/mod);
}
define MOD(a, b) ((((a)%(b))+(b))%(b))
unsigned mod(int a, unsigned b) {
return (a >= 0 ? a % b : b - (-a) % b);
}
我会这样做:
((-1)+8) % 8
在进行模运算之前,将后一个数字加到第一个数字上,从而得到所需的7。这对于任何数字都应该有效,最小可达-8。对于-9,添加2*8。
(-1) & 8 == 7
- Henricus V.(-1) & 8 == 7
?(-1) & 8
只会产生0或8,而不是7。也许你的意思是(-1) & (8-1)
? - chux - Reinstate Monica