具有余数的整数除法的C ++确定性

时间:2013-07-14 11:54:44

标签: c++ integer-division math.h

我有一个关于在C / C ++中用整数余数执行除法的问题。据说在两个整数之间的除法运算中,如果结果不能表示为整数,则其十进制中的非整数部分将被删除。 例如,int a = 17;一个/ = 3; / 伪浮点数a,得到值5.6666 .. /所以结果是5.这是由于点后的部分而在算术中同时具有余数的正常除法的结果(6666。 。)实际上是将余数(2)除以3。 这适用于我的compter,但是它绝对可靠,或者我必须使用float声明,然后使用floor转换为int以保证安全吗?对于性能和安全性哪个更好? 提前谢谢。

3 个答案:

答案 0 :(得分:4)

C ++中对整数的算术运算不依赖于计算机 如果ab是整数,a / b将始终为您提供除法的整数商,a % b将始终为您提供整数除法的余数。

就性能而言,您可以查看this StackOverflow question,但它似乎取决于架构。

答案 1 :(得分:1)

您应该使用a / ba % b进行整数除法和余数。正如Levans所说,这些可以保证为您提供独立于您的硬件的“正确”值(至少ab为正)。使用浮点运算时,结果可能会受到舍入误差的影响,舍入误差也可能与硬件有关。

答案 2 :(得分:0)

因此,您可以获得两个浮点数,而不是整数模数,然后将一个浮点数乘以除法符的倒数:

17.0 * 0.33 = 5.61

然后将它()变成一个整数并减去:

5.61 - 5 ----> 0.61

然后将结果乘以0.33的倒数:

0.61 * 3 ------> 1.83 

然后ceil()它

2    ----> this is 17%3
根据用户“Oseiskar”的基准测试,这比使用直接模数慢14倍。