Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;相当于Java';s Math.floorMod()?_C++_Modulus - Fatal编程技术网

C++ C++;相当于Java';s Math.floorMod()?

C++ C++;相当于Java';s Math.floorMod()?,c++,modulus,C++,Modulus,在Java中,我们有两种不同的模(和remiander)操作,%和Math.floorMod()。不同之处在于映射目标的区域,它可以取决于第一个操作数的符号,也可以取决于第二个操作数的符号 在C++中是否有一个等价的(快速)操作,其效果与数学>? 我目前采用以下方法(出于性能原因,它甚至不完全等同于Math.floorMod()): inlineintfloor\u mod(intx,inty){ x%=y; if(x

在Java中,我们有两种不同的模(和remiander)操作,
%
Math.floorMod()
。不同之处在于映射目标的区域,它可以取决于第一个操作数的符号,也可以取决于第二个操作数的符号

在C++中是否有一个等价的(快速)操作,其效果与<代码>数学>? 我目前采用以下方法(出于性能原因,它甚至不完全等同于

Math.floorMod()
):

inlineintfloor\u mod(intx,inty){
x%=y;
if(x<0){
x+=y;
}
返回x;
}
我认为可能有一个内在的或类似的东西,在某些CPU上只编译成一条指令。

恐怕你得自己做一个。一行程序是一个自定义的
floorModulo
,但是如果您希望使用
无符号int&
作为除数,那么一行程序测试可能会更快(更可读)

#包括
int myCustomModulo(常量int&a、常量int&b);
int main()
{
标准::cout
cmath头文件中的余数()函数类似于math.floorMod()
对于整数运算

#include <cmath>
remainder(dividend, divisor)


虽然我不知道有任何内在函数能够执行这样的操作,但我想修改asker的实现,以便更好地模拟Java函数
Math.floorMod(股息、除数)

constexpr int floor\u mod(整数被除数,整数除数)
{
返回[除数,余数=股息%除数]{
返回余数&(余数<0!=除数<0)
?余数+除数
:余数;
} ();
}
此函数针对一些琐碎的输入进行测试


额外操作产生的开销似乎小于额外模所需的开销(例如,参见那些快速基准测试:或)。

如果(y<0)不应该是
if吗如果说
x
-101
y
100
x%=y
的结果与
x=x%y
相同,那么
x
将是
-101%100
,这等于
-1
(在C++)。因此,您需要检查
x
是否为负数,以便在必要时对其进行补码。@BlayerBond好吧,版本似乎与java函数等效,但不是太多。我感到困惑,因为我不理解您的上一条注释,认为我错了。同时,我重写了它,以确保它具有相同的输出。谢谢您的帮助关于
signed int
s的情况下应该在
y
上进行额外的if测试,您的评论是对的。我重写了
main
以进行检查,并得到了更清晰的结果。
| mod & +divisor | mod & -divisor |
| :------------- | -------------- |
| -5 mod 3  =  1 | -5 mod -3 = -2 |
| -4 mod 3  =  2 | -4 mod -3 = -1 |
| -3 mod 3  =  0 | -3 mod -3 = 0 |
| -2 mod 3  =  1 | -2 mod -3 = -2 |
| -1 mod 3  =  2 | -1 mod -3 = -1 |
|  0 mod 3  =  0 |  0 mod -3 = 0 |
|  1 mod 3  =  1 |  1 mod -3 = -2 |
|  2 mod 3  =  2 |  2 mod -3 = -1 |
|  3 mod 3  =  0 |  3 mod -3 = 0 |
|  4 mod 3  =  1 |  4 mod -3 = -2 |
|  5 mod 3  =  2 |  5 mod -3 = -1 |
| mod & +divisor | mod & -divisor |
| :------------- | :--------------|
| -5 mod 3 =  1  | -5 mod -3 = -2 |
| -4 mod 3 =  2  | -4 mod -3 = -1 |
| -3 mod 3 =  0  | -3 mod -3 =  0 |
| -2 mod 3 =  1  | -2 mod -3 = -2 |
| -1 mod 3 =  2  | -1 mod -3 = -1 |
|  0 mod 3 =  0  |  0 mod -3 =  0 |
|  1 mod 3 =  1  |  1 mod -3 = -2 |
|  2 mod 3 =  2  |  2 mod -3 = -1 |
|  3 mod 3 =  0  |  3 mod -3 =  0 |
|  4 mod 3 =  1  |  4 mod -3 = -2 |
|  5 mod 3 =  2  |  5 mod -3 = -1 |
#include <cmath>
remainder(dividend, divisor)

int floor_mod(int x, int y)
{   
   return  x-(x/y)*y  ;  
}
constexpr int floor_mod(int dividend, int divisor)
{
    return [divisor, remainder = dividend % divisor] {
        return remainder && (remainder < 0 != divisor < 0)
            ? remainder + divisor
            : remainder;
    } ();
}