我需要在C中进行模256运算.所以我可以简单地做
unsigned char i;
i++;
Run Code Online (Sandbox Code Playgroud)
代替
int i;
i=(i+1)%256;
Run Code Online (Sandbox Code Playgroud) 在Python和Ruby中,带符号的整数除法向负无穷大截断,有符号整数模数与第二个操作数具有相同的符号:
>>> (-41) / 3
-14
>>> (-41) % 3
1
Run Code Online (Sandbox Code Playgroud)
但是,在C和Java中,带符号的整数除法截断为0,有符号整数模数与第一个操作数的符号相同:
printf("%d\n", (-41) / 3); /* prints "-13" */
printf("%d\n", (-41) % 3); /* prints "-2" */
Run Code Online (Sandbox Code Playgroud)
在C和Python中执行相同类型的除法和模数的最简单,最有效的方法是什么?
gcc SIGFPE为以下代码生成浮动代码:
#include <limits.h>
int x = -1;
int main()
{
return INT_MIN % x;
}
Run Code Online (Sandbox Code Playgroud)
但是,我在标准中找不到此代码调用未定义或实现定义的行为的语句.据我所知,它需要返回0.这是gcc中的错误还是我错过了标准的一些特殊例外?
我注意到我的电脑上有一个奇怪的东西。*手写的可分性测试明显比%算子快。考虑最小的例子:
* AMD 锐龙 Threadripper 2990WX,GCC 9.2.0
static int divisible_ui_p(unsigned int m, unsigned int a)
{
if (m <= a) {
if (m == a) {
return 1;
}
return 0;
}
m += a;
m >>= __builtin_ctz(m);
return divisible_ui_p(m, a);
}
Run Code Online (Sandbox Code Playgroud)
该示例受奇数a和 的限制m > 0。然而,它可以很容易地推广到所有a和m。代码只是将除法转换为一系列加法。
现在考虑使用以下命令编译的测试程序-std=c99 -march=native -O3:
for (unsigned int a = 1; a < 100000; a += 2) {
for (unsigned int m …Run Code Online (Sandbox Code Playgroud) Perl的
print 2 % -18;
Run Code Online (Sandbox Code Playgroud)
- >
-16
Run Code Online (Sandbox Code Playgroud)
TCL
puts [expr {2 % -18}]
Run Code Online (Sandbox Code Playgroud)
- >
-16
Run Code Online (Sandbox Code Playgroud)
但是VBScript
wscript.echo 2 mod -18
Run Code Online (Sandbox Code Playgroud)
- >
2
Run Code Online (Sandbox Code Playgroud)
为什么不同?
我正在尝试实现三角学的范围缩减操作.但相反,我认为对输入数据执行模数pi/2操作可能会更好.我想知道什么算法存在并且对于32位IEEE 754浮点的这种操作有效?
我必须在汇编中实现它,所以只用一条指令就不能使用fmod,除法,乘法等.我的处理器使用16位字,我实现了32位浮点加法,减法,乘法,除法,平方根,余弦和正弦.我只需要范围缩减(模数)来输入余弦和正弦值.
我一直在编写以下重现关系的程序:
An = 5An-1 - 2An-2 - An-3 + An-4
Run Code Online (Sandbox Code Playgroud)
输出应该是答案模数10 ^ 9 + 7 ..我为此写了一个蛮力方法如下......
long long int t1=5, t2=9, t3=11, t4=13, sum;
while(i--)
{
sum=((5*t4) - 2*t3 - t2 +t1)%MOD;
t1=t2;
t2=t3;
t3=t4;
t4=sum;
}
printf("%lld\n", sum);
Run Code Online (Sandbox Code Playgroud)
其中MOD= 10^9 +7
每件事似乎都是真的..但我得到了一些价值的否定答案..由于这个问题,我无法找到正确的解决方案...... Plz帮助保持正确的地方Modulus
ThreadLocal出于好奇,我一直在看JDK 中的实现,我发现了这个:
/**
* Increment i modulo len.
*/
private static int nextIndex(int i, int len) {
return ((i + 1 < len) ? i + 1 : 0);
}
Run Code Online (Sandbox Code Playgroud)
看起来很明显,这可以用一个简单的实现return (i + 1) % len,但我认为这些人知道他们的东西.知道为什么他们这样做了吗?
这段代码高度针对性能,使用自定义映射来保存线程局部映射,弱引用以帮助GC变得聪明等等,所以我想这是性能问题.Java模数是否缓慢?
难道保证(-x) % m,在这里x和m在C++中积极标准(C++ 0x中)为负,等于-(x % m)?
我知道它在我知道的所有机器上都是正确的.
在关于运算符的CoffeeScript文档中,它表示您可以使用%%真正的数学模,但没有解释为什么这与%JavaScript中的"模运算符"不同.
更进一步说它a %% b在CoffeeScript中相当于(a % b + b) % b用JavaScript 编写,但是对于大多数简单的情况,这似乎产生了相同的结果.
modulo ×10
c ×5
c++ ×3
division ×2
java ×2
overflow ×2
assembly ×1
binary ×1
coffeescript ×1
gcc ×1
javascript ×1
math ×1
operators ×1
performance ×1
perl ×1
recurrence ×1
tcl ×1
vbscript ×1
x86 ×1