C++ 03状态中的$ 5.6/4 - "如果两个操作数都是非负的,那么余数是非负的;如果不是,则余数的符号是实现定义的74).
注74是
根据正在进行的ISO C修订工作,整数除法的首选算法遵循ISO Fortran标准ISO/IEC 1539:1991中定义的规则,其中商始终向零舍入.
C++ 0x状态 -
$ 5.6/4-"对于积分操作数,/运算符产生代数商,丢弃任何小数部分; 79如果商a/b在结果类型中可表示,
(a/b)*b + a%b则等于a.
注79说
这通常被称为截断为零.
所以我有两个问题:
有人可以解释这个"截断为零"的概念吗?
具有负操作数的模数是否在C++ 0x中定义为行为?
怎么来计算器-1 mod 26 = 25,但是用C或Java -1 % 26 == -1.我需要一个像计算器一样解决它的程序.这两者有区别吗?
我只是听说过x mod (2^32-1),并x / (2^32-1)会很容易,但如何?
计算公式:
x n =(x n-1 + x n-1/b)mod b.
因为b = 2^32,它很容易x%(2^32) == x & (2^32-1); 和x / (2^32) == x >> 32.(这里的^不是XOR).当b = 2 ^ 32 - 1时如何做到这一点.
在页面https://en.wikipedia.org/wiki/Multiply-with-carry.他们说" arithmetic for modulus 2^32 ? 1 requires only a simple adjustment from that for 2^32".那么"简单调整"是什么?
我正在加密,对于私钥指数d,你需要将d乘以e并取另一个数的mod,并将余数设为1.我已经具有的函数是:
private void genD() {
d = e / 2;
// solve for d given d*e = 1 (mod eN)
while ((d * e) % eN != 1) {
d++;
}
}
Run Code Online (Sandbox Code Playgroud)
我现在所拥有的显然是一种蛮横的做事方式,经历每一个数字直到一个有效.我知道方程式完成它的工作,使用这里找到的工作示例插入数字,但是使用我正在生成的数字非常非常慢.从逻辑上讲,我觉得有一种方法可以更快地完成这项任务,但我无法想到如何做到这一点?
任何帮助表示赞赏!提前致谢 :)
假设我有Long someLong = 1004L.我可以使用什么有效的方法将其舍入到1000L?请注意,我实际上并不知道,someLong == 1004L所以我不能简单地这样做someLong -= 4L;.我需要一个可推广的方法.我也希望能够向下舍入到每个5而不是每个10,例如一个1005L舍入到的函数(因为如果我们舍入为5s然后它将向上舍入而不是向下舍入).
更多的例子..可能是我有1926L,我想要圆润到5我需要的意思1925L.或者我需要四舍五入到10我需要的意义1930L.
688 ^ 79 mod 3337 = 1570.
当我在wolfram alpha尝试这个时,我得到了:

但是当我在Matlab中输入同样的东西时,我得到364作为答案.我做错了.

任何关于此的亮点将不胜感激.
所以在我的教科书中有一个使用f#的递归函数的例子
let rec gcd = function
| (0,n) -> n
| (m,n) -> gcd(n % m,m);;
Run Code Online (Sandbox Code Playgroud)
使用此功能,我的教科书通过执行以下内容给出了示例
gcd(36,116);;
Run Code Online (Sandbox Code Playgroud)
并且由于m = 36而不是0,那么它的第二个句子是这样的:
gcd(116 % 36,36)
gcd(8,36)
gcd(36 % 8,8)
gcd(4,8)
gcd(8 % 4,4)
gcd(0,4)
and now hits the first clause stating this entire thing is = 4.
Run Code Online (Sandbox Code Playgroud)
我没有得到的是这个(%)百分号/操作符或此连接中调用的任何内容.对于一个实例我不知道如何
116 % 36 = 8
Run Code Online (Sandbox Code Playgroud)
我现在已经多次转过头了,我无法想象这怎么会变成8?
我知道对于那些知道这一点的人来说这可能是一个愚蠢的问题,但我非常感谢你的帮助.
核心R引擎有一个严重的缺陷,它表达了Modulus操作的输出:
ceiling((1.99 %% 1) * 100)
返回:99(正确)
ceiling((2.99 %% 1) * 100)
返回:100(不正确)
该行为将显示在任何整数值N + 2.99(例如3.99等)中.如果这与浮点表示相关联,则系统不会表达差异的完整细节.这尤其令人不安,因为:
两者(1.99 %% 1)并且(2.99 %% 1) 似乎返回0.99.
两者((1.99 %% 1) * 100)并且((2.99 %% 1) * 100) 似乎返回99.
但是,如果进行任何舍入或类似的数学运算,则2.99 的不可见残值会以意外的方式翻转.
虽然为我当前的应用程序解决这个问题是微不足道的:
floor((2.99 - floor(2.99)) * 100)
返回:99(正确)
sprintf("%.22f", floor((2.99 - floor(2.99)) * 100))
返回:99.0000000000000000000000(正确)
...我想知道有多少其他实例Modulus返回坏值而没有底层细节来显示浮点delta.有没有办法揭露模数似乎附加的基础残值?它是不可见的.
编辑:根据下面的andrew.punnett的慷慨示例,print(1.99, digits = 22)返回1.99(没有浮动扩展),而print(1.99 %% 1, digits = 22)返回0.98999999999999999.根据Aaron的敏锐眼光,这似乎与版本和/或系统有关.
谢谢!
我发现以下行为令人惊讶:
int a = -2;
int b = 5;
uint c = 5;
std::cout << a%b << '\n';
std::cout << a%c << '\n';
Output:
-2
4
Run Code Online (Sandbox Code Playgroud)
当涉及比较时,混合有符号和无符号是有问题的 - 运算符中是否存在隐藏的比较%,或者此处是否还有其他事情发生?
Nim中的模数运算符是多少?
tile % 9 == 0 导致未声明的标识符:'%'
谷歌搜索或搜索SO没有提出答案.