作为一名数学家,我最讨厌的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++允许模板和操作符重载的可能性,但这两者对我来说都是浑水摸鱼.我们非常感激地收到了这些例子.
首先,我想指出的是,你甚至不能相信(-1) % 8 == -1
.你唯一能依靠的就是(x / y) * y + ( x % y) == x
.然而,余数是否为负值则为implementation-defined.
编号:C++03第5.6段第4条:
二元/运算符产生商,而二元%运算符产生第一个表达式除以第二个表达式的余数.如果/或%的第二个操作数为零,则行为未定义;否则(a/b)*b+a%b等于a.如果两个操作数均为非负,则其余操作数为非负;100.
这里,它遵循处理两个负操作数的版本,以便可以从dividend中减go divisor中的remainder的结果,因此它将是实际除法的floor.mod(-1,8)
等于7,而mod(13, -8)
是-3.
int mod(int a, int b)
{
if(b < 0) //you can check for b == 0 separately and do what you want
return -mod(-a, -b);
int ret = a % b;
if(ret < 0)
ret+=b;
return ret;
}