Java 为什么较大数字的平方根计算速度较慢?
这是一段Java代码,用于请求一个数字,然后在不使用Math.sqrt()方法的情况下打印其平方根: 请在您的计算机上运行此程序,并测试几个数字。 对于低于30.1的数字,它运行并快速计算平方根。但是,当您输入30.2或更大的数字时,不会计算平方根(至少在可行的等待条件下)!Java 为什么较大数字的平方根计算速度较慢?,java,Java,这是一段Java代码,用于请求一个数字,然后在不使用Math.sqrt()方法的情况下打印其平方根: 请在您的计算机上运行此程序,并测试几个数字。 对于低于30.1的数字,它运行并快速计算平方根。但是,当您输入30.2或更大的数字时,不会计算平方根(至少在可行的等待条件下)! 对这种行为有什么有趣的解释吗 将执行时更改为: do { x = (x+n/x)/2; System.out.println(x); System.out.println(x*x); } while
对这种行为有什么有趣的解释吗 将执行时更改为:
do {
x = (x+n/x)/2;
System.out.println(x);
System.out.println(x*x);
} while(Math.abs(x*x-n)>TOL*2*x);
这重复给出(对于输入30.2):
如您所见,是5.495452665613634 30.1999999999992的平方,这导致条件Math.abs(x*x-n)>TOL*2*x
总是被填满(差异是7.105427357601002E-15
。而条件是>5.4954526656136345E-15
,这是真的)
换句话说,您忘记了计算机程序在存储值方面有一些限制,或者您的TOL不够高将do while更改为:
do {
x = (x+n/x)/2;
System.out.println(x);
System.out.println(x*x);
} while(Math.abs(x*x-n)>TOL*2*x);
这重复给出(对于输入30.2):
如您所见,是5.495452665613634 30.1999999999992的平方,这导致条件Math.abs(x*x-n)>TOL*2*x
总是被填满(差异是7.105427357601002E-15
。而条件是>5.4954526656136345E-15
,这是真的)
换句话说,您忘记了计算机程序在存储值方面有一些限制,或者您的TOL不够高。整个代码是建立在这样一个前提上的:在某个时刻,您将获得x的正确值。你从随机对象中得到的东西会影响时间,你选择的数字大小也会影响时间
这并不是计算sqrt的有效方法 整个代码是建立在这样一个前提之上的,即在某个时刻,您将获得x的正确值。你从随机对象中得到的东西会影响时间,你选择的数字大小也会影响时间
这并不是计算sqrt的有效方法 为什么是随机的?精心选择的双重编码避免类似计算的
x*x
在代码中,您可以将
*2
添加到TOL定义中,并从循环中删除*2
好的编程可以删除所有不必要的东西为什么是随机的?精心选择的双重编码避免类似计算的
x*x
在代码中,您可以将
*2
添加到TOL定义中,并从循环中删除*2
好的编程消除了所有不必要的东西问题在于double
的精度有限:所表示的数字越大,不准确度越大-即存储不同的double
所需的最小更改越大
一旦您尝试的答案超过某个数字大小,double
就无法精确解析该数字,以达到TOL
定义的精度 问题是double
的精度有限:所表示的数字越大,不准确度越大-即存储不同double
所需的最小更改越大
一旦您尝试的答案超过某个数字大小,
double
就无法精确解析该数字,以达到TOL
定义的精度 这里有所谓的计算数字平方根的方法。然而,我认为你的停止条件应该只是一个标量(例如TOL
),而不是TOL*2*x
你有的是所谓的计算一个数字的平方根的方法。然而,我认为停止条件应该只是一个标量(例如TOL
),而不是TOL*2*x
,对于某些输入,它会变成一个无限循环。while循环完全按照它应该做的做并不是很“奇怪”。也许使用调试器或在循环中放入print语句可以揭开谜团。使用此方法要求0.5E-15
的准确性有点太高。除非你需要平方根来确保火星探测车安全着陆,否则你对输出的描述是错误的。只要尝试一些更大的数字,比如100或225,而不仅仅是精确的整数平方。对于某些输入,它会变成一个无限循环。一个while循环完全按照它应该做的做并不是很“奇怪”。也许使用调试器或在循环中放入print语句可以揭开谜团。使用此方法要求0.5E-15
的准确性有点太高。除非你需要平方根来确保火星探测车安全着陆,否则你对输出的描述是错误的。只需尝试一些较大的数字,例如100或225,而不仅仅是精确的整数平方。
5.495452665613634
30.199999999999992