Java 为什么较大数字的平方根计算速度较慢?

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

这是一段Java代码,用于请求一个数字,然后在不使用Math.sqrt()方法的情况下打印其平方根:

请在您的计算机上运行此程序,并测试几个数字。 对于低于30.1的数字,它运行并快速计算平方根。但是,当您输入30.2或更大的数字时,不会计算平方根(至少在可行的等待条件下)!
对这种行为有什么有趣的解释吗

将执行时更改为:

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