Tag: 数学

为什么int * float比int / int快?

我一直在读点浮点数学就像一个小型的Arduino微控制器坏了。 因此,在尝试使用更少的花车时,我发现了一些奇怪的东西。 // Baseline float brightness = 0.05; int result = someInt * brightness; // Takes about twice as long int brightness = 20; int result = someInt / brightness; 两者都有相同的目标,将整数减少到原始值的二十分之一。 但在进行数学优化时,我不确定为什么浮点数更快。

这段代码如何从任何基数阶乘法中找到尾随零的数量?

下面的代码完美无缺,但我希望有人向我解释它背后的数学。 基本上,它是如何工作的? #include #include /* atoi */ #define min(x, y) (((x) < (y)) ? (x) : (y)) int main(int argc, char* argv[]) { const int base = 16; int n,i,j,p,c,noz,k; n = 7; /* 7! = decimal 5040 or 0x13B0 – 1 trailing zero */ noz = n; j = base; /* Why do we […]

为什么在比较范围内的数字时,汇编代码中是否出现分支?

我正在读这个问题,这是接受的答案。 我阅读了评论,但我无法弄清楚产生优化的原因。 使用以下代码时,为什么在汇编代码中出现分支? x >= start && x <= end 编辑: 为清楚起见,我想了解接受答案产生优化的原因。 据我所知,编译器生成的汇编代码中存在分支。 我想了解为什么生成的代码中有一个分支。

在三维网格上有效地找到等成本点,并且点数成本最低

我有一个3d网格 ,其中网格上的每个点(x,y,z) 与 成本值相关联 。 任何点(x,y,z)的成本都不是事先知道的 。 要知道成本,我们需要进行一个非常昂贵的复杂查询。 我们对这个目标知道的一件事是, 所有三个维度的成本都是单调不减少的 。 现在给出成本C,我需要在表面上找到成本为C 的点(x,y,z) 。 这必须通过仅花费最低成本来完成。 如何解决我的问题? 当我在网上搜索时,我得到了与轮廓识别相关的技术,但是所有这些技术都假设所有点的成本都是预先知道的,比如Marching cubes方法等。在我的例子中,主要指标是成本计算的点数应该是最小的。 如果有人能够建议一种获得近似位置的方法,至少如果不准确的话会很有帮助。

2个2D向量的交叉积

任何人都可以提供返回TWO 2d向量的叉积的函数示例吗? 我正在尝试实现此算法 。 C代码会很棒。 谢谢。 编辑:发现另一种方式,它适用于2D,并且很容易。 bool tri2d::inTriangle(vec2d pt) { float AB = (pt.y-p1.y)*(p2.x-p1.x) – (pt.x-p1.x)*(p2.y-p1.y); float CA = (pt.y-p3.y)*(p1.x-p3.x) – (pt.x-p3.x)*(p1.y-p3.y); float BC = (pt.y-p2.y)*(p3.x-p2.x) – (pt.x-p2.x)*(p3.y-p2.y); if (AB*BC>0.f && BC*CA>0.f) return true; return false; }

C / C ++大数计算

我正在尝试在C程序中计算以下数字: result = (3 * pow(2,500000000) – 2 ) % 1000000000 2的力量是大到正确处理的方式=>我的印象是我可以使用模数在许多步骤中拆分计算以减小结果大小。 有人有这样做的策略吗? 还有其他想法吗? 提前完成 马努

纯C中是否有易于使用的矢量/矩阵/四元数学库?

我意识到有几个c ++库,但我更喜欢C.我发现了这个,但它似乎只适用于Mac: https : //github.com/rsebbe/CeedMath

C中的矩阵乘法

我正在尝试用C解决矩阵乘法问题。问题(2×2)中给出的矩阵大小我编写了这段代码,但它没有像我期望的那样打印结果。 我想我对C的规则缺少一点。 我在这段代码中的错误是什么? #include int main() { int matA[2][2]={0,1,2,3}; int matB[2][2]={0,1,2,3}; int matC[2][2]; int i, j, k; for (i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { for(k = 0; k < 2; k++) { matC[i][j] += matA[i][k] * matB[k][j]; } printf("%d\n",matC[i][j]); } } } 打印结果: 2 3 […]

计算给定范围内偶数的最简单方法

计算无符号整数范围内偶数的最简单方法是什么? 例如:如果范围是[0 … 4]那么答案是3(0,2,4) 我很难想到任何简单的方法。 我提出的唯一解决方案涉及几个if语句。 是否有一行简单的代码可以在没有if语句或三元运算符的情况下执行此操作?

理解Visual C ++的rand()函数的算法

在C / C ++中,当我们想要获得一个随机整数时,我们通常会使用rand()和srand() 。 但是当我试图自己重写它时,我发现很难理解算法。 这个函数很容易写成几行,但公式是误解。 主要配方: ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L; 原始代码涉及: void __cdecl srand (unsigned int seed) { _getptd()->_holdrand = (unsigned long)seed; } int __cdecl rand (void) { _ptiddata ptd = _getptd(); return ( ((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff ); }