实现根计算功能
|
实现各种功能的数学函数非常简单。
int mul(int,int);
,int pow(int,int);
,甚至double div(float,float);
很容易做到,并且可以通过循环或递归来实现。 (这些方法是用手或在头上执行这些功能的相同方法。)要相乘,只需重复将数字相加即可。要进行除法,请反复减去。要获得力量,反复乘以。等等。
我一直想知道的一个数学函数是根。例如,您将如何编写一个函数来计算数字(即double root(float num, float root);
)的平方根(或立方等)?我尝试环顾四周,却找不到执行此操作的算法或方法。
当我尝试手动计算根数时,通常会使用guess方法(从一个近似数开始,加上一个分数,相乘,看看相差多少,再加上一个较小的分数,相乘,再次检查,直到满足为止)。我想这可能行得通,但是肯定有更好的方法,而且更快(无论计算机比手动完成速度快多少)。
显然,LUT是无关紧要的,因为它必须足够通用才能接受任何操作数(除非您使用有限的数据集编写游戏)。 Wikipedia文章提到了guess方法,并列出了一些古老的方法(早于发明计算机之前),以及一些纯数学甚至微积分方法(包括一些以“无穷大”为成分的方法)。似乎唯一与电子学有关的东西使用技巧或对数。 (这仅适用于平方根,更不用说立方根了。)
有没有简单的根计算方法?计算器如何做?电脑如何做到? (不,简单地执行double pow(a,0.5);
是行不通的,因为then5将会如何实施?)
我只是将根函数与更简单的函数错误地组合了吗?它们比看起来复杂吗?
没有找到相关结果
已邀请:
3 个回复
师埠女
这是x87计算任意幂的一些代码:
但是请注意,您通常不希望仅通过重复加法来实现乘法,也不希望仅通过重复减法来实现除法。相反,您想对连续的2的幂进行移位和加/减,以更快地获得结果。 这是一些显示一般想法的代码:
对于x86而言,这是毫无意义的,因为它内置了乘法指令,但是在较旧的处理器(PDP-11、8080、6502等)上,这种代码非常普遍。
孤捷侩
古擅坛犯