c语言实现巴比伦求平方算法,巴比伦平方根算法 - 初始猜测值(Babylonian square root algorithm - initial guess value)...

巴比伦平方根算法 - 初始猜测值(Babylonian square root algorithm - initial guess value)

我一直在寻找用JavaScript编写的巴比伦平方根算法,并找到了这个有效的解决方案:

function sqrt(num) {

var accuracy = 0.000001;

function isPrecise(estimation) {

if (Math.abs( Math.pow(estimation, 2) - num ) < accuracy) {

return true

} else {

return false

}

}

function improvePrecision(estimation) {

return (estimation + (num / estimation)) / 2;

}

function iteration(estimation) {

if(isPrecise(estimation)) {

return estimation;

} else {

return iteration(improvePrecision(estimation));

}

}

return iteration(num);

}

但是我看不出初始猜测(在代码estimation )值的定义在哪里。 那么它是如何工作的,当第一次迭代没有猜测值时? 实际上,这个值应该等于num参数。

I was looking for Babylonian square root algorithm written in JavaScript, and found this working solution:

function sqrt(num) {

var accuracy = 0.000001;

function isPrecise(estimation) {

if (Math.abs( Math.pow(estimation, 2) - num ) < accuracy) {

return true

} else {

return false

}

}

function improvePrecision(estimation) {

return (estimation + (num / estimation)) / 2;

}

function iteration(estimation) {

if(isPrecise(estimation)) {

return estimation;

} else {

return iteration(improvePrecision(estimation));

}

}

return iteration(num);

}

But I can't see where is initial guess (in code - estimation) value is defined. So how it works, when there is no guess value on first iteration? Actually, this value should be eaqual to num argument.

原文:https://stackoverflow.com/questions/46024310

更新时间:2019-12-28 07:29

最满意答案

estimation在迭代函数内部定义。

当函数第一次运行时,使用num参数调用迭代函数, return iteration(num) 。

在iteration内部函数中,算法首先检查估计是否正常。

如果不是,则再次调用iteration ,但这次,它首先改进给定的estimation

return iteration(improvePrecision(estimation));

因此, iteration是递归函数,除非估计足够精确,否则它将调用自身:( isPrecise(estimation) )

The estimation is defined inside of the iteration function.

When the function runs the first time, the iteration function is called with the num parameter, return iteration(num).

Inside iteration function, the algorithm first checks if the estimation is ok.

If not, iteration is called again, but this time, it first improves the given estimation

return iteration(improvePrecision(estimation));

So iteration is recursive function, which will call itself unless the estimation is precise enough: (isPrecise(estimation))

2017-09-03

相关问答

牛顿的方法在整数上运作得非常好: def isqrt(n):

x = n

y = (x + 1) // 2

while y < x:

x = y

y = (x + n // x) // 2

return x

这将返回x * x不超过n的最大整数x 。 如果你想检查结果是否恰好是平方根,只需执行乘法来检查n是否是一个完美的正方形。 我在我的博客上讨论这个算法,以及另外三种计算平方根的算法。 Newton's method works

...

很容易看出你是否进行了一些运行并打印了x和y的连续值。 例如100: 50.5 1.9801980198019802

26.24009900990099 3.8109612300726345

15.025530119986813 6.655339226067038

10.840434673026925 9.224722348894286

10.032578510960604 9.96752728032478

10.000052895642693 9.999947104637101

10.00000

...

estimation在迭代函数内部定义。 当函数第一次运行时,使用num参数调用迭代函数, return iteration(num) 。 在iteration内部函数中,算法首先检查估计是否正常。 如果不是,则再次调用iteration ,但这次,它首先改进给定的estimation return iteration(improvePrecision(estimation)); 因此, iteration是递归函数,除非估计足够精确,否则它将调用自身:( isPrecise(estimation

...

0x3f7fffff是1.0 - u ,其中u = 2**-24 。 sqrt(1 + x)的泰勒级数是: sqrt(1 + x) = 1 + x/2 - x^2/8 + O(x^3)

如果我们插入x ,我们得到: sqrt(1 - u) = 1 - u/2 - u^2/8 - O(u^3)

值1 - u/2是两个最接近的浮点数1-u和1之间的确切中间点; 因为泰勒级数中的下一项是负数,所以sqrt(1 - u)值只是略小一点,所以结果下降到1 - u 。 0x7f7fffff仅为2**128

...

我相信你应该使用相对错误的终止,而不是绝对错误。 while (abs((guess*guess-x) / guess) > 0.00001)

否则,需要很长时间(这不是无限循环)来计算非常长的值的平方根。 http://en.wikipedia.org/wiki/Approximation_error 干杯! 编辑:此外,正如下面在评论中所指出的,值得检查一下guess是否已经被猜测出来,以避免在某些特定情况下的无限循环。 I believe you should use relative e

...

在确定时间复杂性方面,考虑算法将终止多少“步骤”。 在这种情况下,我们基本上是二进制搜索来找到平方根。 因此,我们需要考虑的步骤数量是您的算法进行了多少次比较。 因为它是二进制搜索,所以我们知道它处于O(log(n)) ,因为您可以将二进制搜索视为每次将可搜索空间减半。 所以现在我们需要弄清楚什么是n 。 我们正在搜索从(0, val)的范围(low, high) (0, val) 。 但是因为我们正在寻找浮点数,并且您关心的精度高达0.00001 ,所以我们可以有效地将范围乘以100000 ,以

...

为什么不对结果进行平方,如果它不等于输入,则加或减(取决于差异的符号)最低有效位,平方,并检查是否会产生更好的结果? 这里更好的意思是绝对差异较小。 唯一可能变得棘手的情况是当与尾数“交叉”√2时,可以一次性检查这一点。 编辑 我意识到上面的答案是不够的。 简单地在32位FP中进行平方并与输入进行比较并不能提供足够的信息。 假设y = your_sqrt(x)。 你将y 2与x进行比较,发现y 2 > x,从y中减去1 LSB获得z(注释中为y1),然后将z 2与x进行比较,发现不仅z 2

...

您需要更改if语句以检查该数字是否在targetnum-error和targetnum+error范围内: public static void babyRoot(double num , double err)

{

testnum = 0.5 * (testnum + (targetnum / testnum));

System.out.println("Test number equals: " + testnum);

if ((testnum >= (Math.sq

...

上面的代码展示了UB(未定义的行为),因此不应该信任它在任何平台上工作。 这是因为它写入一个union的成员并从一个不同于上次用于编写union的成员读回。 它还在很大程度上取决于字节顺序(多字节整数内字节的排序)。 但是,它通常会执行预期的操作,并了解为什么值得您阅读IEEE 754 binary32浮点格式 。 IEEE754二进制32格式的速成课程 IEEE754通常将32位浮点分为1个符号位,8个指数位和23个尾数位,从而给出 31 30-23

...

对于足够大的数字v和足够小的数字z , v = v + z ; 是无操作 - v不会改变。 这使你的循环运行了很长时间。 算法不是一个好选择 - 你应该查看Newton-Raphson方法。 我不相信你的算法适用于像1E-70这样的极端数字(你已经证明它不适用于像1E+70这样的数字)。 请注意,在具有IEEE浮点支持的大多数机器上,双精度范围最高可达1E±300或更高。 你能否解释一下为什么某个限制v = v + z是一个无操作请? 浮点数具有有限的十进制数字 - 通常为大约16左右。 如果添加

...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值