Tag: 数学

在C中计算64×64 int产品的高64位

我希望我的C函数能够有效地计算两个64位有符号整数的乘积的高64位。 我知道如何在x86-64程序集中执行此操作,使用imulq并从%rdx中提取结果。 但是我完全不知道如何在C语言中编写它,更不用说让编译器有效地执行它了。 有没有人有任何建议用C写这个? 这是性能敏感的,所以“手动方法”(如俄罗斯农民或bignum图书馆)已经出局。 我写的这个笨拙的内联汇编函数很有用,大致是我追求的代码: static long mull_hi(long inp1, long inp2) { long output = -1; __asm__(“movq %[inp1], %%rax;” “imulq %[inp2];” “movq %%rdx, %[output];” : [output] “=r” (output) : [inp1] “r” (inp1), [inp2] “r” (inp2) :”%rax”, “%rdx”); return output; }

取消设置最右边的设置位

可能重复: 如何在C中设置,清除和切换一个位? 删除最低位 n是正整数。 如何解除最右边的设置位? 假设n = 7 => n = 0111.我想要0110作为输出。 是否有任何简单的按位攻击来实现目标?

较小股息和较大除数的模数如何工作?

7 % 3 = 1 (remainder 1) 如何 3 % 7 (余数?) 工作?

如何检查点(x,y)是否在笛卡尔坐标系中的多边形内?

这个问题在这里已有答案: 指向Polygon aka命中测试 C#指向多边形 给定在笛卡尔坐标系中用N线方程组成的随机多边形,是否有任何标准公式用于检查点(x,y)的隶属度? 简单的解决方案是获取所有线公式,并检查点X是否在该线下方,在该线上方以及在另一条线的右侧,等等。但这可能是单调乏味的。 我应该注意,多边形可以是任何形状,具有任意数量的边,并且可以是凹的或凸的。 为方便起见,我已经添加了这些实用function: float slope(CGPoint p1, CGPoint p2) { return (p2.y – p1.y) / (p2.x – p1.x); } CGPoint pointOnLineWithY(CGPoint p, float m, float y) { float x = (y – py)/m + px; return CGPointMake(x,y); } CGPoint pointOnLineWithX(CGPoint p, float m, float x) { float y = m*(x – […]

取幂的前n位数

如何确定取幂的前n位数(a b )。 eg: for a = 12, b = 13 & n = 4, the first 4 digits are 1069.

libc随机数生成器有缺陷吗?

考虑一种算法来测试在特定次数的尝试之后从一组N个唯一数字中挑选某个数字的概率(例如,N = 2,轮盘中的概率是什么(没有0),它需要X尝试黑赢?) 对此的正确分布是pow(1-1 / N,X-1)*(1 / N)。 但是,当我使用下面的代码测试时,X = 31处始终存在深沟,独立于N,并且独立于种子。 这是一个内在的缺陷,由于PRNG的实施细节在使用中无法防止,这是一个真正的错误,还是我忽略了一些明显的东西? // C #include #include #include int array[101]; void main(){ int nsamples=10000000; double breakVal,diffVal; int i,cnt; // seed, but doesn’t change anything struct tms time; srandom(times(&time)); // sample for(i=0;i<nsamples;i++){ cnt=1; do{ if((random()%36)==0) // break if 0 is chosen break; cnt++; }while(cnt<100); array[cnt]++; } // […]

有效地实现floored / euclidean整数除法

地板划分是指结果总是向下(朝-∞),而不是0: 是否有可能在C / C ++中有效地实现floored或euclidean整数除法? (显而易见的解决方案是检查股息的标志)

在这种情况下,“加法”和“按位或”是否相同?

假设我有四个32位数字,定义为它们的位不重叠,即 unsigned long int num0 = 0xFF000000; unsigned long int num1 = 0x00FF0000; unsigned long int num2 = 0x0000FF00; unsigned long int num3 = 0x000000FF; 在每个号码中,在FF的位置可以有任何东西。 我是否正确地说添加和按位或者总是会为这种数字产生相同的输出? 谢谢!

如何编写一个C程序来检查一个点是否位于一个正方形内,给定一个对角线的端点

我正在解决上面提到的问题但是对数学方程和变量太过困惑了。 我开始尝试找到另外两个点的坐标,但是方程式无法由我解决,存在很多变量,我感到困惑。 如果这已经完成,我会尝试检查关于两侧的点的位置,但这也包括很多变量和混乱。 一个好的算法可能会有所帮助。 谢谢!

使用帧之间的相位变化从FFT区提取精确频率

我一直在浏览这篇精彩的文章: http : //blogs.zynaptiq.com/bernsee/pitch-shifting-using-the-ft/ 虽然太棒了,但却非常艰难而且沉重。 这种材料真的让我感到舒服。 我从Stefan的代码模块中提取了数学,该模块计算给定bin的确切频率。 但我不明白最后的计算。 有人能告诉我最后的数学结构吗? 在深入研究代码之前,让我设置一下场景: 假设我们设置fftFrameSize = 1024,所以我们处理512 + 1个bin 例如,Bin [1]的理想频率适合帧中的单个波。 在40KHz的采样率下,tOneFrame = 1024 / 40K秒= 1/40秒,因此Bin [1]理想地将采集40Hz信号。 设置osamp(overSample)= 4,我们以256为步长沿着输入信号前进。因此,第一个分析检查字节0到1023,然后是256到1279等。注意每个浮点数被处理4次。 … void calcBins( long fftFrameSize, long osamp, float sampleRate, float * floats, BIN * bins ) { /* initialize our static arrays */ static float gFFTworksp[2*MAX_FRAME_LENGTH]; static float gLastPhase[MAX_FRAME_LENGTH/2+1]; […]