Tag: math

从基于来源的指数转换为基于目的地的指数

我在一些C代码中使用AVX2指令。 VPERMD指令采用两个8整数向量a和idx并通过基于idx置换a来生成第三个向量dst 。 这似乎相当于dst[i] = a[idx[i]] for i in 0..7 。 我正在调用此源代码,因为该移动是基于源索引的。 但是,我有基于目的地forms的计算索引。 这对于设置数组是很自然的,相当于dst[idx[i]] = a[i] for i in 0..7 。 如何从基于源的表单转换为基于目标的表单? 一个示例测试用例是: {2 1 0 5 3 4 6 7} source-based form. {2 1 0 4 5 3 6 7} destination-based equivalent 对于这种转换,我留在ymm寄存器中,这意味着基于目标的解决方案不起作用。 即使我要单独插入每个,因为它只在常量索引上运行,你不能只设置它们。

在Pebble中将圆分为n等分的坐标

我试图用直线将圆分成n个相等的部分。 想法是获得圆周上的终点坐标,然后绘制线。 找到coodrinates我使用以下代码: static void getPoints(int x0,int y0,int r) { double angle = 0; double angleToRadian = 0; for(int i = 0 ; i < noOfDividingPoints ;i++) { angle = i * (360/noOfDividingPoints); angleToRadian = ( angle * 3.141 ) / 180; APP_LOG(APP_LOG_LEVEL_DEBUG, "LOG: Angle: %lf, AngleToRadian: %lf", angle, angleToRadian ); x[i] = (int) (x0 […]

这个C成语是什么意思?

可能重复: John Carmack不寻常的快速反向平方根(Quake III) 我最近在博客上看到了这段代码 – 它来自Quake3引擎。 它意味着使用Newton-Rhapson方法快速计算逆平方根。 float InvSqrt (float x){ float xhalf = 0.5f*x; int i = *(int*)&x; i = 0x5f3759df – (i>>1); x = *(float*)&i; x = x*(1.5f – xhalf*x*x); return x; } 做int i = *(int*)&x;的原因是什么int i = *(int*)&x; ? 做int i = (int) x; 相反,给出了完全不同的结果。

线性插值:基于2D表计算校正

我尝试做的事情应该只是一个二维的线性插值,但目前我找不到正确的方法。 为了简单地描述问题:有一个大小为3000×3000像素的绘图区域,我必须画一条水平线。 为此,我从每个像素位置到下一个像素位置绘制点或短线,然后形成一条线。 现在必须对整个事物应用校正,其中校正信息可以在(对于该示例简化)4×4arrays中找到,其中每个元素包含描述校正后的值的一对坐标。 所以中性数组(没有校正)看起来像这样: 0,0 1000,0 2000,0 3000,0 0,1000 1000,1000 2000,1000 3000,1000 0,2000 1000,2000 2000,2000 3000,2000 0,3000 1000,3000 2000,3000 3000,3000 真正的校正表将包含描述要进行的校正的其他坐标: 因此,作为输入数据,我在没有校正的情况下具有点上的点的坐标,没有校正的字段值和校正数据。 但是,如何计算现在应用校正值的线点,以便绘制如图像右侧所示的扭曲线? 我目前使用X和Y的两个单独线性插值的方法不起作用,Y位置在单元格边界上跳跃但在单元格内没有平滑变化。 所以…任何想法如何做到这一点?

如何正确添加/减去128位数字(如两个u_int64_t)

我在C中工作,需要添加和减去64位数字和128位数字。 结果将保存在128位数字中。 我使用整数数组来存储128位数的上半部和下半部(即u_int64_t bigNum[2] ,其中bigNum[0]是最不重要的)。 任何人都可以帮助添加和减法函数,可以接受bigNum并添加/减去u_int64_t吗? 我在网上看到了很多不正确的例子,所以请考虑一下: bigNum[0] = 0; bigNum[1] = 1; subtract(&bigNum, 1); 此时bigNum[0]应该设置所有位,而bigNum[1]应该没有设置位。

如何准确地乘以和除以64位整数?

我有一个C函数: int64_t fn(int64_t a, int32_t b, int32_t c, int32_t d) { /* should return (a * b * c)/d */ } a可能接近INT64_MAX,但最终结果不会溢出,例如,如果b = 1,则c = d = 40.但是,我无法弄清楚如何计算这个以便我永远不会丢失数据舍入(通过先进行除法)或中间结果溢出。 如果我可以访问足够大的数据类型以适应a,b和c的整个产品,我只会在该类型中进行数学运算然后进行截断,但是有一些方法可以在没有大整数的情况下执行此操作吗?

从IP范围转换为CIDR掩码

我一直在研究一种算法,用于将IP范围转换为CIDR表示法中的列表IP(将在下文中作为元组提及)。 现在,令我困惑的是弄清楚这种转换的最坏情况场景是什么; 我可以获得IPv4范围的最大元组数是多少? 我可以为IPv6范围获得的最大元组数是多少? 这怎么算?erp 我正在使用以下Python脚本的修改过的C版本(不是递归的): 1 #!/usr/bin/env python 2 3 import sys 4 import re 5 6 def ip2int(ip) : 7 ret = 0 8 match = re.match(“(\d*)\.(\d*)\.(\d*)\.(\d*)”, ip) 9 if not match : return 0 10 for i in xrange(4) : ret = (ret <> 24 15 ip2 = ipnum >> 16 & […]

生成添加到特定数字的所有唯一数字组合

我正在编写一个程序来尝试解决数学问题。 我需要生成一个唯一的列表,其中包含与另一个数字相加的所有数字。 例如,加起来为5的4个数字的所有unqiue组合是: 5 0 0 0 4 1 0 0 3 2 0 0 3 1 1 0 2 2 1 0 2 1 1 1 这在perl中很容易暴力,但我在C中工作并希望找到更优雅的解决方案。 在perl中,我会在每列中生成每个可能的数字0-N组合,丢弃那些没有加到目标数字的组合,然后对每行中的数字进行排序并删除重复的行。 我整个上午都在尝试用C写这个,但似乎无法找到一个满意的解决方案。 我需要它才能达到最大N约25 。 你们有什么想法吗? 这是我一直在尝试的一种例子(这会产生重复的组合): // target is the number each row should sum to. // Don’t worry about overflows, I am only using small values […]

消除模偏差:如何在arc4random_uniform()函数中实现?

模数偏差是在天真地使用模运算来获得小于给定“上限”的伪随机数时出现的问题。 因此,作为C程序员,我使用arc4random_uniform()函数的修改版本来生成均匀分布的伪随机数。 问题是我不明白这个函数是如何工作的,数学上。 这是函数的解释性注释,后跟完整源代码的链接: /* * Calculate a uniformly distributed random number less than upper_bound * avoiding “modulo bias”. * * Uniformity is achieved by generating new random numbers until the one * returned is outside the range [0, 2**32 % upper_bound). This * guarantees the selected random number will be inside * [2**32 % […]

math.h ceil在C中没有按预期工作

为什么ceil()会在没有分数部分的情况下进行均匀浮动? 当我尝试这样做时: double x = 2.22; x *= 100; //which becomes 222.00… printf(“%lf”, ceil(x)); //prints 223.00… (?) 但是当我将2.22的值更改为2.21时 x *= 100; //which becomes 221.00… printf(“%lf”, ceil(x)); //prints 221.00… as expected 我尝试用另一种方式使用modf()并遇到另一个奇怪的事情: double x = 2.22 * 100; double num, fraction; fraction = modf(x, &num); if(fraction > 0) num += 1; //goes inside here even when […]