2013-10-14 53 views
-3

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

我有两个选择。

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

第二个的缺点所花费的时间是在检查的单纯进程是否真的精确到在每次迭代中五十个小数位需要一些时间,所以结果将不准确。如果还有其他方法可以做到这一点,请告知我

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

我应该采取哪一种行动?

+4

请告诉我们你的努力,直到现在 - 你试图解决这个问题。 – Lion

+0

(侧身思考)计算你的根一次,然后检查其数字一千次。把那个时间除以1,000,你知道检查费用多少。 (关于-h,小心缓存问题 - 你不*想要比较一个单独运行与eachother。) – usr2564301

回答

0

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

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

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. 

你实际上怎么办很短的睡眠是任务的一部分,所以我会离开,对于你找出:

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 
    }   
} 

然后你使用伪代码一样启动线程。

0

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

另外:无论如何你都需要这样的测试。通常情况下,人们对给定错误的结果感兴趣。由于所需时间取决于很多其他东西(CPU,JVM等),所以在已知时间内未获得未知准确度。从这是对第二种方法的投票。

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的其余部分有办法报告中间解决方案。

+0

首先,我会避免扩展'Thread'类,就像你曾经决定使用一些Java的更好的并发特性,你将不得不“无条件地”代码。 –