余数整除的C++确定性

C++ certainity of Integer Division with remainder

本文关键字:确定性 C++ 余数整      更新时间:2023-10-16

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

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

在性能方面,您可以看看这个StackOverflow问题,但它似乎取决于体系结构。

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

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

17.0 * 0.33 = 5.61

然后将其floor()转换为整数并减去:

5.61 - 5 ----> 0.61

然后将结果与0.33:的倒数相乘

0.61 * 3 ------> 1.83 

然后接收

2    ----> this is 17%3

根据用户"Oseiskar"的基准测试,这比使用直接模量慢14倍。