计算平方根到50个位置

时间:2013-10-14 19:33:41

标签: java square-root

我正在做一个科学公平项目,测试五种不同的平方根算法来计算两个平方根。 (见我的问题here)。

我有两个选择。

  • 运行每个程序一段时间,并比较最终结果与两个平方根的接近程度。
  • 运行每个程序,直到2的平方根精确到小数点后50位,并比较使用System.nanoTime()
  • 所用的时间

第二个问题的缺点是,在每次迭代中检查它是否精确到五十个小数位的过程需要一些时间,因此结果将不准确。如果还有其他方法,请通知我

第一个问题的缺点是我不知道如何在一段时间内运行程序。

我应该采取哪种行动?

3 个答案:

答案 0 :(得分:0)

  

我不知道如何在一段时间内运行程序。

一种选择是运行需要在线程中运行x时间的代码 在时间到时终止线程,然后让线程代码显示其结果 像这样的东西。

import java.io.*;
public class SqrtThread extends Thread{
  private vars.....
  public SqrtThread (double input) { 
    super('sqrtThread');
    this.input = input;
    ....
    this.start();
  }

  public void run() {
    while !(Thread.interrupted) {   
      //Do numberChruching
    }
    //output result
  }           
}

然后使用伪代码启动线程,如:

SqrtThread sqrtThread = new SqrtThread(2); //Will start automatically
start high resolution timer
while (time has not elapsed) {
  sleep for very short period;
}
sqrtThread.interrupt(); //stop the thread.

你实际上如何进行非常短暂的睡眠是作业的一部分,所以我会留下让你找出来。

答案 1 :(得分:0)

测试所消耗的时间对于每种方法都是相同的。因此,如果您对比较感兴趣,这不是一个缺点。此外,我怀疑测试所消耗的时间并不重要。

另外:无论如何你需要这样的测试。通常,一个人对给定错误的结果感兴趣。由于所需的时间取决于很多其他东西(CPU,JVM等),因此在已知时间内获得的未知精度不是很高。由此投票支持第二种方法。

答案 2 :(得分:0)

如果你花了一定的时间,然后打断这个过程,你就会有一个有趣的问题要回答:

  • 您是否收集了足够的数据来回答这个问题?

我会让你思考这个问题,而我建议你如何打断一个仍在计算的答案。

首先,您应该提前知道平方根的前五十位,因为您需要“知道”答案是否正确。正确性应该与它需要多长时间无关,所以也许你只需要验证计算一次,然后硬编码正确的答案。

其次,您需要将平方根计算算法打包到可以运行的内容中。我建议使用Java接口Runnable,它强制使用签名

的方法
public void run() {
  // your code goes here
}

然后你会得到一些能与Java Thread完美融合的东西,你可以打断Java线程。一旦中断了线程的结果,你就不能相信线程内的任何计算(在正常情况下)。

最简单的方法(因为你的项目不是利用最新的Java技术,而是试图反驳你的反假设)是做类似的事情

Thread solution1 = new Thread(new Runnable1());
solution1.start();
如果你发现事情花了太长时间,

以后

Thread.sleep(10000);  // sleeps the current thread 10 seconds
solution1.interrupt();

请注意,这是停止线程的一种非常不优雅的方式,您不能相信Runnable1之后正在处理的任何内容。

其他更复杂的技术可用,例如:

public class Runnable1 implements Runnable {

  private boolean running;

  public Runnable1() {
    running = false;
  }

  public void run() {
    running = true;
    while (running) {
      // do one step of your computation
    }
  }

  public void shutdown() {
    running = false;
  }
}

上面的例子有很多功能,确实可以提高Java代码的质量;但是,请注意代码质量与证明您的观点无关。抛出代码非常好,忘记实际解决问题。

然后将上面的代码称为

Runnable1 runnable1 = new Runnable1();
Thread thread1 = new Thread(runnable1);
thread1.start

// some means of waiting
Thread.sleep(10000); // sleeps 10 seconds
runnable1.shutdown();

这种技术在已知状态下(在下一次循环迭代之前)关闭你的runnable,所以你可能会从技术中捕获一些中间数据,前提是Runnable的其余部分有办法报告中间解决方案。