2

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

4

3 回答 3

4

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

在性能方面,你可以看看这个 StackOverflow question,但它似乎依赖于架构。

于 2013-07-14T12:10:27.263 回答
1

您应该使用a / banda % 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 回答