Tag: 数学

算法挑战:为浮点生成连续分数

( 编辑 :回应脾气暴躁的评论,不,这不是功课。我正在进行音调检测,获取一系列潜在的谐波峰值,并尝试构建基频的候选者。因此,它实际上是一个非常实际的问题。 ) 考虑(例如)pi的最佳分数近似,按增加的分母排序:3 / 1,22 / 7,355 / 113,…… 挑战:创建一个整洁的 C算法,它将为给定的浮点数生成第n个商近似值a / b,同时返回差异。 calcBestFrac(float frac,int n,int * a,int * b,float * err){…} 我认为最好的技术是持续分数 拿走pi的小部分,你得到3 现在,余数是0.14159 … = 1 / 7.06251 .. 所以下一个最佳理性是3 + 1/7 = 22/7 从7.06251拿走7,你得到0.06251 ..大约1 / 15.99659 .. 称之为16,然后是下一个最佳近似值 3 + 1 /(7 + 1/16)= 355/113 但是,转换成干净的C代码远非微不足道。 如果我得到一些整洁的话,我会发帖。 同时,有人可能会喜欢它作为脑力激荡器。

什么决定将用于存储临时值的数据类型?

这可能是非常基本的,但我很好奇是什么原因。 当处理不同类型的操作(例如乘法和除法)时,不同类型(int,float等)的数据决定了哪些数据类型被选中? 例如,如果我执行以下操作: float a = 5 / 10; 我将得到“0”,因为5和10暂时存储在我们进行除法的int中,然后我们把它放在浮点数中。 对? 但如果我们改为: float a = (float)5 / 10; 我们得到0.5而不是。 在这种情况下,在C中,当float优先于int时,决策是如何看待的?

带负数的模数

可能重复: 带负值的模数运算 – 怪异的事情? 负数的Mod正在融化我的大脑! 我尝试做25 % -9只是为了好玩而我得到的答案是-2(这是在谷歌上)当我用C代码做到这一点时我得到7.有人能解释我为什么有两个不同的答案吗?

C / C ++中的衍生物?

我有一些表达式,如x^2+y^2 ,我想用它来进行一些数学计算。 我想做的一件事就是对表达式进行偏导。 因此,如果f(x,y) = x^2 + y^2那么f相对于x的部分将是2x ,相对于y的部分将是2y 。 我使用有限差分方法编写了一个很小的函数,但是我遇到了很多浮点精度问题。 例如,我最终得到1.99234而不是2 。 有没有支持符号差异化的图书馆? 还有其他建议吗?

为什么即使我使用浮子,5/2也会产生’2’?

我输入了以下代码(没有编译问题或任何东西): float y = 5/2; printf(“%f\n”, y); 输出只是: 2.00000 我的数学没错,是吗? 或者我错了/运营商? 这意味着鸿沟不是吗? 5/2应该等于2.5? 任何帮助是极大的赞赏!

C中的多字加法

我有一个使用GCC的__uint128_t的C程序很棒,但现在我的需求已经超越了它。 我有196或256位快速算术的选择吗? 我需要的唯一操作是加法(我不需要进位,即,我将使用mod 2 ^ 192或2 ^ 256)。 速度很重要,所以如果可能的话,我不想转向一般的多精度。 (实际上我的代码确实在某些地方使用了多精度,但这是在关键循环中并且将运行数百亿次。到目前为止,多精度需要运行数万次。) 也许这很简单,可以直接编码,或者我需要找到一些合适的库。 你的建议是什么,哦Stack Overflow? 澄清:GMP对我的需求来说太慢了。 虽然我实际上在我的代码中使用了多精度,但它不在内循环中并且运行时间少于10 ^ 5次。 热循环运行更像10 ^ 12次。 当我改变我的代码(增加一个尺寸参数)以使多精度部分比单精度运行更频繁时,我的速度减慢了100倍(主要是由于内存管理问题,我认为,而不是额外的μops)。 我希望将其降低到4倍或更好。

在浮点中实现pow()函数的最有效方法

我正在尝试实现我自己的pow()和sqrt()函数版本,因为我的自定义库没有pow()/ sqrt()浮点支持。 有人可以帮忙吗?

AND按位运算的数学方程?

例如,在左移操作中, 5 << 1 = 10 10 << 1 = 20 然后可以建立一个数学方程, n << 1 = n * 2. 如果存在左移操作的等式, 那么有可能还有一个 AND运算的数学方程? 或任何其他按位运算符?

找到包含所有矩形的最小区域

这是一个面试问题。 我们给出了各种矩形的尺寸,我们必须找出可以包围所有矩形的矩形区域(最小值)? 矩形也可以旋转。 test case:- input: 3 //number of rectangles 8 8 4 3 3 4 output: 88 11×8: + – – – – – – + + – + | | | | | | | | | | + – + | | + – + | | | | | | | […]

特定的模乘算法

我有3个大的64位数字:A,B和C.我想计算: (A x B) mod C 考虑到我的寄存器是64位,即写a * b实际上产生(A x B)mod2⁶⁴。 最好的方法是什么? 我在C编码,但在这种情况下不认为语言是相关的。 在获得指向此解决方案的评论之后: (a * b) % c == ((a % c) * (b % c)) % c 让我具体一点:这不是一个解决方案,因为((a%c)*(b%c))可能仍然大于2⁶⁴,寄存器仍会溢出并给我错误的答案。 我会: (((A mod C)x(B mod C))mod2⁶⁴)mod C.