我有一个关于在 C/C++ 中用整数余数执行除法的问题。据说在两个整数之间的除法运算中,如果结果不能表示为整数,则将其不是整数的部分以十进制去除。例如,int a=17;a/=3;/伪浮点 a,得到 5.6666.. / 所以结果是 5。这是由于点(6666..)之后的部分实际上是除余数(2)乘以 3。这适用于我的计算机,但它绝对可靠吗?或者我必须用浮点数声明,然后将其转换为 int 以确保安全?性能和安全哪个更好?提前致谢。
问问题
2151 次
3 回答
4
C++ 中整数的算术运算不依赖于计算机。
如果a
和b
是整数,a / b
将始终为您提供除法的整数商,并a % b
始终为您提供整数除法的余数。
在性能方面,你可以看看这个 StackOverflow question,但它似乎依赖于架构。
于 2013-07-14T12:10:27.263 回答
1
您应该使用a / b
anda % b
进行整数除法和余数。正如 Levans 所说,这些保证可以为您提供独立于您的硬件的“正确”值(至少如果a
并且b
是肯定的)。使用浮点运算,结果可能会受到舍入误差的影响,这也可能与硬件有关。
于 2013-07-14T12:17:24.503 回答
0
因此,您可以获得两个浮点数,然后将一个浮点数与除数的倒数相乘,而不是整数模:
17.0 * 0.33 = 5.61
然后将 floor() 转换为整数并减去:
5.61 - 5 ----> 0.61
然后将结果乘以 0.33 的倒数:
0.61 * 3 ------> 1.83
然后 ceil() 它
2 ----> this is 17%3
根据用户“Oseiskar”的基准测试,这比使用直接模数要慢 14 倍。
于 2013-07-14T12:02:22.057 回答